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

本尼·莱特

我试图了解大学考试的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
}

socket_client.c

#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#define SA struct sockaddr
#define MSG_LEN 17

int main(){
    struct sockaddr_in srv_addr;
    int ret, sk;
    char msg[MSG_LEN];

    sk = socket(AF_INET, SOCK_STREAM, 0);
    printf("Socket created! :)\n");
    memset(&srv_addr, 0, sizeof(srv_addr));
    srv_addr.sin_family = AF_INET;
    srv_addr.sin_port = htons(1234);
    ret = inet_pton(AF_INET, "192.168.1.132", &srv_addr.sin_addr);

    printf("Trying to establish a connection with 192.168.1.132 on port 1234...");  
    ret = connect(sk, (SA *) &srv_addr, sizeof(srv_addr)); //faccio una richiesta sul socket
    if(ret != -1) printf("Connection established! :D\n");
    else printf(" connection error :(\n");

    strcpy(msg, "something to send"); //scrivo messaggio in una stringa
    printf("sending message: %s\n", msg);
    ret = send(sk, (void *) msg, strlen(msg), 0); //invio il messaggio sul socket
    if(ret == -1 || ret < strlen(msg))
        printf("send ERROR! :(\n");

    close(sk);  
}

并使用以下代码进行编译:

gcc socket_client.c -o socket_client
gcc socket_server.c -o socket_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

有什么问题?我不明白!:(我一步一步地遵循了我的老师的指导。

我在64位arch Linux上运行;)谢谢您的回应!

斯蒂芬·乌尔里希(Steffen Ullrich)
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连接的套接字cn_sk上,而是在侦听器套接字上sk如果您进行检查,errno您可能会看到ENOTCONN

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

套接字C ++:recv函数返回-1

来自分类Dev

C套接字:recv并同时发送

来自分类Dev

套接字编程-连接尝试失败异常

来自分类Dev

套接字编程-recv()未正确接收数据

来自分类Dev

recv和recvfrom,使用python进行套接字编程

来自分类Dev

recv()函数不读取输入(套接字编程)

来自分类Dev

套接字-软件导致连接中止:recv失败

来自分类Dev

C#套接字编程,关闭窗口

来自分类Dev

c#套接字编程错误

来自分类Dev

接收特定的消息套接字编程C

来自分类Dev

Ubuntu中的C ++ UDP套接字编程

来自分类Dev

C套接字-send()发送,recv()未接收

来自分类Dev

Android套接字编程

来自分类Dev

套接字编程

来自分类Dev

AVR的套接字编程

来自分类Dev

Python套接字编程

来自分类Dev

套接字编程

来自分类Dev

套接字编程ConnectException

来自分类Dev

使用C ++进行的Unix套接字编程,recv返回0,但仍在接收数据,但有时接收的内容比发送的要多

来自分类Dev

(C套接字编程)将服务器的send()调用与结束于同一客户端recv()缓冲区中的服务器分开

来自分类Dev

发送失败后关闭套接字不会导致recv函数返回错误状态

来自分类Dev

Java套接字失败

来自分类Dev

MySQL的套接字失败

来自分类Dev

为什么 inet_ntoa 总是返回错误的 IP 地址(套接字编程公司)

来自分类Dev

linux中的分段错误(C中的套接字编程(TCP))

来自分类Dev

用C在Linux中进行套接字编程

来自分类Dev

无法转换为C中的指针类型套接字编程

来自分类Dev

在C套接字编程中写入/读取整数的正确方法

来自分类Dev

套接字编程C ++错误未定义参考