编辑:下面的代码已经被修改为正确接收和发送,并考虑到发送的消息的实际字节数(后者由于EJP)
我正在用Unix编程.
我有服务器和客户端应该交换msgs.虽然客户端似乎发送消息正常,但服务器不会收到客户端发送的消息.我已经尝试使用recv()和read()(我知道他们几乎是相同的事情,但额外的标记在recv()),但我没有运气,我不知道真的是什么问题.
每次发送消息后,我将睡眠(3)放入客户端代码,但是我看到一旦客户端和服务器连接,服务器立即关闭,而不用等待传入的消息.我究竟做错了什么?
这是客户端代码:
#define SERVER_TCP_PORT 11112 #define MAX_DATA_SIZE 500 int main(int argc,char * argv[]) { int sockfd; char * host; char msg[MAX_DATA_SIZE];/* = "get my msg!\n";*/ int msg_len; struct hostent * hp; struct sockaddr_in client_address,server_address; printf("y halo thar\n"); // looking up from the host database if (argc == 2) host = argv[1]; else exit(1); printf("sdf\n"); hp = gethostbyname(host); if (!hp) exit(1); printf("host found\n"); // setting up address and port structure information bzero((char * ) &server_address,sizeof(server_address)); // copy zeroes into string server_address.sin_family = AF_INET; bcopy(hp->h_addr,(char *) &server_address.sin_addr,hp->h_length); server_address.sin_port = htons(SERVER_TCP_PORT); printf("set\n"); // opening up socket if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 ) exit(1); printf("opened\n"); // connecting if (connect(sockfd,(struct sockaddr *) &server_address,sizeof(server_address)) < 0) exit(1); printf("connected\n"); int i; for (i = 0; i < MAX_DATA_SIZE; ++i) { msg[i] = '.'; } msg[MAX_DATA_SIZE-1] = '\0'; for(i = 0; i < 11; i++) { // send message to connected socket msg_len = write(sockfd,msg,MAX_DATA_SIZE); if(msg_len < 1) printf("notsent\n"); else printf("%i bytes sent\n",msg_len); // recieve messages from connected socket msg_len = read(sockfd,MAX_DATA_SIZE); if (msg_len < 1) printf("not recieved\n"); else { printf("%i bytes received\n",msg_len); printf(msg); printf("\n"); } } // close connection close(sockfd); printf("closed\n"); }
这是服务器端
#define SERVER_TCP_PORT 11112 #define MAX_DATA_SIZE 500 int main() { printf("o halo thar\n"); int sockfd,new_sockfd; int client_addr_len; char msg [MAX_DATA_SIZE]; int msg_len; char got_msg [11] = "got ur msg\0"; struct sockaddr_in server_address,client_address; // setting up address and port structure information bzero((char * ) &server_address,sizeof(server_address)); // copy zeroes into string server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(SERVER_TCP_PORT); // opening up socket if ((sockfd = socket(AF_INET,0)) < 0 ) exit(1); printf("socket is opened\n"); // binding if (bind(sockfd,sizeof(server_address)) < 0) exit(1); printf("socket is bound\n"); // listening listen(sockfd,5); printf("listening\n"); // block and wait for an incoming connection client_addr_len = sizeof(client_address); new_sockfd = accept(sockfd,(struct sockaddr *) &client_address,&client_addr_len); if (new_sockfd < 0) exit(1); printf("accepted\n"); int i; for( i = 0; i < 11; i++) { // recieve messages from connected socket printf("waiting\n"); msg_len = read(new_sockfd,MAX_DATA_SIZE); if (msg_len < 1) { printf("no msg recieved\n"); } else { printf("bytes recieved: %i\n",msg_len); } // send message to connected socket msg_len = write(new_sockfd,got_msg,sizeof(got_msg)); if (msg_len < 1) printf("not sent\n"); else printf("%i bytes sent\n",msg_len); } // close connection close(sockfd); printf("socket closed. BYE! \n"); }