网络编程send和recv的问题
在linux下,按照网上的资源,编写了client和server函数。想在client端不停地输入字符串,
然后在server端打印出来。
出现的问题是,先启动server端,启动client之后,server迅速就关闭了。。。
server代码:
/*
server1.c
2013-7-24
*/
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define BUFFER_SIZE 1024
#define SERVPORT 3333
int main()
{
char buffer[BUFFER_SIZE];
//********** create socket ******************
int sockfd;
struct sockaddr_in serv;
struct sockaddr_in client;
sockfd=socket(AF_INET,SOCK_STREAM,0);
perror("socket");
printf("errno %d\n",errno);
// printf("sockfd %d\n",sockfd);
if( sockfd < 0 )
{
return 0;
}
//************* bind **********************
bzero(&serv,sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_port = htons(SERVPORT);
serv.sin_addr.s_addr = INADDR_ANY;
int bindFlag;
bindFlag = bind(sockfd,(struct sockaddr*)&serv,sizeof(struct sockaddr));
perror("bind");
printf("errno %d\n",errno);
// printf("sockfd %d inetFlag %d\n",sockfd,inetFlag);
if( bindFlag < 0)
{
return 0;
}
//************** listen *********************
int listenFlag;
int backlog = 5;
listenFlag = listen(sockfd,backlog);
perror("listen");
if( listenFlag < 0)
{
return 0;
}
//************** accept ********************
socklen_t addr_len = sizeof(sockaddr_in);
int acceptFlag;
acceptFlag = accept(sockfd,(struct sockaddr*)&client,&addr_len);
perror("accept");
if( acceptFlag<0 )
{
return 0;
}
//************** recv ***********************
while(1)
{
memset(buffer,0,sizeof(buffer));
int recvBytes = recv(sockfd,buffer,BUFFER_SIZE-1,0);
if(recvBytes == 0 || recvBytes == -1)
{
printf("client closed");
return 0;
}
printf("recv:%s\n",buffer);
}
system("pause");
return 0;
}
/*
net program
2013-7-23
*/
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define BUFFER_SIZE 1024
int main()
{
char buffer[BUFFER_SIZE];
//********** create socket ******************
int sockfd;
struct sockaddr_in dest;
sockfd=socket(AF_INET,SOCK_STREAM,0);
perror("socket");
printf("errno %d\n",errno);
// printf("sockfd %d\n",sockfd);
if( sockfd < 0 )
{
printf("Create Socket Error.\n");
return 0;
}
bzero(&dest,sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(3333);
int inetFlag;
//inetFlag = inet_aton("192.168.123.5",(struct
in_addr*)&dest.sin_addr.s_addr);
inetFlag = inet_aton("127.0.0.1",(struct in_addr*)&dest.sin_addr.s_addr);
perror("inet_aton");
printf("errno %d\n",errno);
// printf("sockfd %d inetFlag %d\n",sockfd,inetFlag);
if( inetFlag == 0)
{
printf("set error.\n");
return 0;
}
//************** connect *********************
int connectFlag;
connectFlag = connect(sockfd, (struct sockaddr *) &dest, sizeof(dest));
perror("connect");
printf("errno %d\n",errno);
// int errFlag = GetLastError();
// printf("sockfd %d connectFlag %d\n",sockfd,connectFlag);
if( connectFlag < 0)
{
//printf("sockfd = %d\n",sockfd);
//printf("Connect error.\n");
return 0;
}
//************** send ***********************
while(1)
{
printf("输入一个字符串:");
scanf("%s",buffer);
int ret = send(sockfd,buffer,strlen(buffer),0);
if(ret==0 || ret==-1)
{
printf("server closed");
return 0;
}
}
system("pause");
return 0;
}
[解决办法]
gdb上去看看recv的流程和返回值。
[解决办法]
while(1)
{
printf("输入一个字符串:");
scanf("%s",buffer);
int ret = send(sockfd,buffer,strlen(buffer),0);
if(ret==0
[解决办法]
ret==-1)
{
printf("server closed");
return 0;
}
}
int ret = send(sockfd,buffer,strlen(buffer),0);
if(ret==-1)
{
printf("server closed");
return 0;
}
//int recvBytes = recv(sockfd,buffer,BUFFER_SIZE-1,0);//你这是啥意思呢?
int recvBytes = recv(acceptFlag,buffer,BUFFER_SIZE-1,0);
//这样才是对的,accept成功后返回的套接字,才是和客户端之间进行通讯的套接字的
//而且recv本身就是阻塞函数,能满足你的要求