我在套接字编程中遇到错误。 bind()函数执行后会挂起。 这里是代码:
int socket_rcv,new_socket; struct sockaddr_in add1, add2; int test[100]; buffer= test; printf("\n Initializing Socket...."); socket_rcv = socket(AF_INET,SOCK_STREAM,0); if(socket_rcv == -1) { perror("Socket not created.Error:"); return 1; } printf("\n Socket created"); add1.sin_family = AF_INET; add1.sin_addr.s_addr = htonl(INADDR_ANY); add1.sin_port = htons(port_num); if((socket_rcv = bind(socket_rcv,(struct sockaddr*)&add1,sizeof(add1))) == -1) { perror("binding failed. Error:"); return 1; } printf("\n Bind completed"); if(listen(socket_rcv,10) == -1) { perror("listen failed.Error:"); return 1; } socklen_t sizes = sizeof(add2); printf("\n Waiting for connection....."); new_socket = accept(socket_rcv, (struct sockaddr*) &add2, &sizes); if(new_socket != -1) { printf("\n %d, Accepted",new_socket); if(recv(new_socket,(char*)buffer,100,1)<0) { printf("\n No data received from %d socket",new_socket); return 1; } printf("\n Data Received\n"); } else { perror("Accept failed. Error:"); return 1; } close(new_socket); close(socket_rcv); return 0;
我的问题是执行这个代码的时候,它会在bind()函数后挂起。 最后显示的行是“Bind Completed”,之后会挂起。 SO在bind()函数中有问题吗?
在你可以接受来自套接字的连接之前,你必须做三件事情:
socket
函数创建socket
。 从评论你似乎做正确的。 bind
功能的地址。 这告诉系统您正在接受连接的地址。 从评论看来,你也正确地做到了这一点。 listen
函数将套接字标记为“被动”。 这告诉系统该套接字将被用来接受传入的连接。 这是一个完整的程序,显示了接受连接的所有步骤。
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> int main(void) { int server_fd; struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); server_addr.sin_port = htons(8080); if ((server_fd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); return 1; } if (bind(server_fd, (struct sockaddr*) &server_addr, sizeof(server_addr)) == -1) { perror("bind"); return 1; } if (listen(server_fd, 10) == -1) { perror("listen"); return 1; } struct sockaddr_in client_addr; socklen_t client_addrlen = sizeof(client_addr); int client_fd = accept(server_fd, (struct sockaddr*) &client_addr, &client_addrlen); if (client_fd == -1) { perror("accept"); return 1; } puts("Connection accepted"); close(client_fd); close(server_fd); }
所有我上传工作代码,我得到的所有错误得到解决。
if((bind(socket_rcv,(struct sockaddr*)&add1,sizeof(add1))) == -1) { perror("binding failed. Error:"); return 1; } printf("\n Bind completed");
谢谢大家
只是一个FYI,解决这个问题的另一种方法可能是在tcpclient下运行你的C程序 – 即tcpclient会产生你的程序并打开一个到服务器的tcp连接,并将你的程序的标准输出到服务器,并从服务器输出管道到你的程序的标准输入。 这样做的好处在于,你可以让tcpclient尽可能地把所有重要的东西放在套接字等等处,而且你可以把精力集中在程序的核心功能上。 有关更多信息,请参阅http://cr.yp.to/ucspi-tcp/tcpclient.html 。