LinuxC,流式套接字,客户端能连接上服务器端,但是彼此收不到对方发出的数据,急急急!
服务器端代码:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<pthread.h>
#include<unistd.h>
#include<errno.h>
#include<netdb.h>
#include<string.h>
int main(int argc, char *argv[])
{
int sockfd, new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size, portnumber;
char reply[]="收到数据!";
char recv_buf[1024];
int nbytes;
if(argc != 2)
{
fprintf(stderr, "Usage:%s portnumber\a\n", argv[0]);
exit(1);
}
if((portnumber = atoi(argv[1])) < 0)
{
fprintf(stderr, "Usage:%s portnumber\a\n", argv[0]);
exit(1);
}
/*服务器端开始建立socket描述符*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == 1)
{
fprintf(stderr, "socket error:%s portnumber\a\n", strerror(errno));
exit(1);
}
/*服务器端填充sockaddr结构*/
bzero(&server_addr, sizeof(struct sockaddr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(portnumber);
/*捆绑sockfd描述符*/
if(bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
{
fprintf(stderr, "Bind error:%s\n\a", strerror(errno));
exit(1);
}
/*监听sockfd描述符号*/
if(listen(sockfd, 5) == -1)
{
fprintf(stderr, "Listen error:%s\n\a", strerror(errno));
exit(1);
}
printf("服务器进程已开启...\n");
while(1)
{
/*服务器阻塞,直到客户端程序建立连接*/
sin_size;
if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) == -1)
{
fprintf(stderr, "Accept error:%s\n\a", strerror(errno));
exit(1);
}
printf("Server get connection from %s\n", inet_ntoa(client_addr.sin_addr));
if(nbytes = recv(new_fd, recv_buf, 1024, 0) == -1)
{
fprintf(stderr, "Read Error:%s\n\a", strerror(errno));
exit(1);
}
recv_buf[nbytes] = '\0';
printf("Recvived %s data:%s\n", inet_ntoa(client_addr.sin_addr), recv_buf);
if(send(new_fd, reply, strlen(reply), 0) == -1)
{
fprintf(stderr, "Write Error:%s\n", strerror(errno));
exit(1);
}
//puts(reply);
//printf("%d\n", send_num);
/*这个通信已经结束*/
close(new_fd);
}
close(sockfd);
return EXIT_SUCCESS;
}
客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<errno.h>
#include<netdb.h>
#include<string.h>
int main(int argc, char *argv[])
{
int sockfd;
char send_buf[1024], recv_buf[100];
struct sockaddr_in server_addr;
struct hostent *hostl;
int portnumber, nbytes;
if(argc != 3)
{
fprintf(stderr, "Usage:%s portnumber\a\n", argv[0]);
exit(1);
}
if((portnumber = atoi(argv[2])) < 0)
{
fprintf(stderr, "Usage:%s portnumber\a\n", argv[0]);
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnumber);
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == 1)
{
fprintf(stderr, "Socket error:%s\a\n", strerror(errno));
exit(1);
}
/*客户程序发起的连接请求*/
if(connect(sockfd, (struct sockaddr*)(&server_addr), sizeof(server_addr)) == -1)
{
fprintf(stderr, "connect error:%s\n\a", strerror(errno));
exit(1);
}
//连接成功
scanf("%s", &send_buf);
if(send(sockfd, send_buf, strlen(send_buf), 0) == -1)
{
fprintf(stderr, "Write Error:%s\n", strerror(errno));
exit(1);
}
if(nbytes = recv(sockfd, recv_buf, 100, 0) == -1)
{
fprintf(stderr, "Read Error:%s\n\a", strerror(errno));
exit(1);
}
printf("%d\n",nbytes);
recv_buf[nbytes] = '\0';
printf("Data from the server:%s\n", recv_buf);
/*结束通信*/
close(sockfd);
return EXIT_SUCCESS;
}
[解决办法]
你的运算符优先级搞错了!!!
= 的优先级低于 ==
所以下面的if有问题:
if(nbytes = recv(sockfd, recv_buf, 100, 0) == -1)
{
fprintf(stderr, "Read Error:%s\n\a", strerror(errno));
exit(1);
}
应该为:
if ((nbytes = recv(...)) == -1)
{
...
}