首页 > 解决方案 > send() 函数在客户端返回错误地址错误

问题描述

标题对正在发生的事情是不言自明的,对我来说奇怪的是没有像connect(),之类的其他功能accept(),其他人正在返回这个。

这是我的完整代码:

客户:

#include <stdio.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <string.h> 
#include <stdlib.h>
#include<errno.h>

#define PORT 8080 

int main(int argc, char const *argv[]) 
{ 
    int sock = 0, valread; 
    struct sockaddr_in serv_addr; 

     int buffer[1024];
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
        { 
        printf("\n Socket creation error \n"); 
        return -1; 
         } 

    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_port = htons(PORT); 


    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0)  
        { 
        perror("Invalid address \n"); 
        return -1; 
        } 

    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
       { 
        perror("Connection Failed \n"); 
        return -1; 
        } 

      int i, array[argc], countsize;
     if(argc>=2){
     for(i=1; i<argc; i++) {
       int number=atoi(argv[i]);
       array[i-1]=number;
       countsize++;
}

   if(send(sock, array, countsize*sizeof(int), 0)<0)
    {
    printf("Error in send! %s\n", strerror(errno));  //error is happening here
        return -1; 
    }
}
 return 0; 
} 

服务器:


#include <unistd.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <string.h> 
#include<errno.h>
#define PORT 8080 
int main() 
{ 
    int server_fd, new_socket;
    struct sockaddr_in address; 
    int opt = 1; 
    int addrlen = sizeof(address); 
    int buffer;

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) 
        { 
        perror("socket failed"); 
        exit(EXIT_FAILURE); 
        } 


    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR , &opt, sizeof(opt))) 
        { 
        perror("setsockopt"); 
        exit(EXIT_FAILURE); 
        } 
    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = INADDR_ANY; 
    address.sin_port = htons( PORT ); 


    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) 
        { 
        perror("bind failed"); 
        exit(EXIT_FAILURE); 
        } 
    if (listen(server_fd, 3) < 0) 
        { 
        perror("listen"); 
        exit(EXIT_FAILURE); 
        } 
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address,(socklen_t*)&addrlen))<0) 
        { 
        perror("accept"); 
        exit(EXIT_FAILURE); 
        } 

int arguments[10]={0};
int n = recv(new_socket, arguments ,1024*sizeof(int),0);

puts("The client sent the arguments: ");
int j;

for(j=0; j<n/sizeof(int);j++){
   printf("%d", arguments[j]);
   puts(".");
}
    return 0; 
} 

我尝试使用write()以及我更熟悉它的语法(即使我仔细检查了语法send()并且它返回了相同的错误,知道出了什么问题吗?

标签: csockets

解决方案


问题出在这段代码中:

 int i, array[argc], countsize;
 if(argc>=2){
    for(i=1; i<argc; i++) {
       int number=atoi(argv[i]);
       array[i-1]=number;
       countsize++;
    }

countsize未初始化,这意味着它的值是不确定的。然后,您尝试在为其分配任何值之前对其进行递增。读取具有不确定值且从未获得其地址的变量会调用未定义的行为

您想将此变量初始化为 0,以便从已知点开始计数。

 int i, array[argc], countsize = 0;

推荐阅读