C套接字编程:recv总是失败

C套接字编程:recv总是失败,c,sockets,C,Sockets,我正在为大学考试学习C套接字编程。 我举了一个简单的例子: socket_server.c #include <sys/socket.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <arpa/inet.h> #define SA struct sockaddr #define MAX

我正在为大学考试学习C套接字编程。 我举了一个简单的例子:

socket_server.c

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

#define SA struct sockaddr
#define MAX_MESS_LEN 16

int main(){
    struct sockaddr_in my_addr, cl_addr;
    int ret, len, sk, cn_sk;
    char cl_ip[INET_ADDRSTRLEN + 1], msg[MAX_MESS_LEN + 1];

    sk = socket(AF_INET, SOCK_STREAM, 0); //creo socket TCP/IPv4 listener
    printf("socket created! :)\n");
    memset(&my_addr, 0, sizeof(my_addr)); //azzero struttura my_addr
    my_addr.sin_family = AF_INET; //famiglia protocolli IPv4
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY); //in ascolto su qualsiasi interfaccia
    my_addr.sin_port = htons(1234); //porta del socket

    ret = bind(sk, (SA *) &my_addr, sizeof(my_addr)); //lego il socket alla struttura   indirizzo
    printf("socket binded! :)\n");
    ret = listen(sk, 10); //mi pongo in ascolto sul socket con massimo 10 richieste pendenti
    printf("socket listening (on any interface with port 1234)! :)\n");
    len = sizeof(cl_addr);
    printf("socket is going to wait for a request... zzzzZZZ\n");
    cn_sk = accept(sk, (SA *) &cl_addr, &len); //creo il socket connected per la richiesta in cima alla lista
    printf("socket accepted request! :D\n");
    inet_ntop(AF_INET, &cl_addr.sin_addr, cl_ip, INET_ADDRSTRLEN); //converto indirizzo IPv4 cl_addr.sin_addr in stringa (cl_ip)
    printf("IP client: %s\n", cl_ip);

   ret = recv(sk, (void *) msg, MAX_MESS_LEN, MSG_WAITALL); //attendo la ricezione di tutti i caratteri della stringa inviata sul socket dal client
    msg[MAX_MESS_LEN + 1] = '\0';
    printf("received data (%d bytes): %s\n", ret, msg);
    if(ret == -1 || ret < MAX_MESS_LEN)
        printf("recv ERROR! :(\n");

    close(sk); //chiudo il server
}
也许这是一个愚蠢的问题,但服务器中的recv功能总是失败,下面是一个示例输出:

服务器:

socket created! :)
socket binded! :)
socket listening (on any interface with port 1234)! :)
socket is going to wait for a request... zzzzZZZ
socket accepted request! :D
IP client: 192.168.1.132
received data (-1 bytes): ����
recv ERROR! :(
客户:

Socket created! :)
Trying to establish a connection with 192.168.1.132 on port 1234...Connection established! :D
sending message: something to send
有什么问题吗?我不明白(我一步一步地跟着老师走

我运行的是arch linux 64位;) 谢谢您的回复

cn_sk = accept(sk, (SA *) &cl_addr, &len); //creo il socket connected per la richiesta in cima alla lista
...
ret = recv(sk, (void *) msg, MAX_MESS_LEN, MSG_WAITALL); //at
您不需要在连接到客户端的套接字上
recv
,而是在侦听器套接字上
sk
。如果您检查
errno
,您可能会看到
ENOTCONN


您不需要在连接到客户端的套接字上
recv
,而是在侦听器套接字上
sk
。如果您检查
errno
,您可能会看到
ENOTCONN

在错误上使用
perror
而不是
printf
(或者以某种方式显示
errno
strerror(errno)
)。另外,使用所有警告和调试信息进行编译(
gcc-Wall-g
)。然后使用调试器(
gdb
)。仔细阅读的文档。在错误上使用
perror
而不是
printf
(或以某种方式显示
errno
strerror(errno)
)。另外,使用所有警告和调试信息进行编译(
gcc-Wall-g
)。然后使用调试器(
gdb
)。请仔细阅读的文档。谢谢!我不相信我为这样一个愚蠢的错误发布了一个问题,对不起:谢谢!我不相信我为这样一个愚蠢的错误发布了一个问题,对不起:P
Socket created! :)
Trying to establish a connection with 192.168.1.132 on port 1234...Connection established! :D
sending message: something to send
cn_sk = accept(sk, (SA *) &cl_addr, &len); //creo il socket connected per la richiesta in cima alla lista
...
ret = recv(sk, (void *) msg, MAX_MESS_LEN, MSG_WAITALL); //at