刚学习的菜鸟,linux下c编写的网络通信,客户端a先给服务端发送数据,服务端接收到数据,再将接收的数据转给客户端b,现在客户端a能发给服务端,可是客户端b接不到。希望大神能帮忙解决一下。
服务器
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#define PORT 5889
#define MAXSIZE 1024
int main(int argc,char *argv[])
{
int sockfd;
struct sockaddr_in server_addr;
int sin_size,newfd;
struct sockaddr_in client_addr;
char buf[MAXSIZE];
if(argc!=2)
{
fprintf(stderr,"Usage:%s hostname port\a\n",argv[0]);
return 1;
}
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
fprintf(stderr,"Socket Error: %d\a\n",strerror(errno));
return 1;
}
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind Error: %d\a\n",strerror(errno));
return 1;
}
if(listen(sockfd,20))
{
fprintf(stderr,"Listen Error: %d\a\n",strerror(errno));
return 1;
}
while(1)
{
errno = 0;
sin_size=sizeof(struct sockaddr_in);
newfd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size);
if(newfd==-1)
{
fprintf(stderr,"Accept Error: %d\a\n",strerror(errno));
continue;
}
fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));
if(fork()==0)
{
memset(buf,0,sizeof(buf));
if(read(newfd,buf,sizeof(buf))<1)
{
fprintf(stderr,"Read Error: %d\a\n",strerror(errno));
return 1;
}
printf ("I have received:%s\n",buf);
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),stdin);
if(write(newfd,buf,strlen(buf)+1)==-1)
{
fprintf(stderr,"Write Error: %d\n",strerror(errno));
return 1;
}
close(newfd);
}
newfd=-1;
}
close(sockfd);
return 0;
}
客户端a
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <netdb.h>
#include <unistd.h>
#define PORT 5889
int main(int argc,char *argv[])
{
int sockfd;
struct sockaddr_in server_addr;
struct hostent *host;
int nbytes;
char buffer[1024];
if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname port\a\n",argv[0]);
return 1;
}
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname error\n");
return 1;
}
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
fprintf(stderr,"Socket Error: %d\a\n",strerror(errno));
return 1;
}
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%d\a\n",strerror(errno));
return 1;
}
while(1)
{
memset(buffer,0,sizeof(buffer));
fgets(buffer,sizeof(buffer),stdin);
if(write(sockfd,buffer,strlen(buffer)+1)==-1)
{
fprintf(stderr,"Write Error: %d\n",strerror(errno));
return 1;
}
memset(buffer,0,sizeof(buffer));
if(read(sockfd,buffer,sizeof(buffer))<1)
{
fprintf(stderr,"Read Error: %d\a\n",strerror(errno));
return 1;
}
printf ("I have received:%s\n",buffer);
}
close(sockfd);
return 0;
}
客户端b
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <netdb.h>
#include <unistd.h>
#define PORT 5889
int main(int argc,char *argv[])
{
int sockfd,portnumber;
struct sockaddr_in server_addr;
struct hostent *host;
int nbytes;
char buffer[1024];
if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
return 1;
}
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname error\n");
return 1;
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error: %d\a\n",strerror(errno));
return 1;
}
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%d\a\n",strerror(errno));
return 1;
}
while(1)
{
memset(buffer,0,sizeof(buffer));
nbytes=read(sockfd,buffer,sizeof(buffer));
if(nbytes<1)
{
fprintf(stderr,"Read Error:%d\a\n",strerror(errno));
return 1;
}
printf("I have received:%s\n",buffer);
memset(buffer,0,sizeof(buffer));
fgets(buffer,sizeof(buffer),stdin);
if(write(sockfd,buffer,strlen(buffer)+1)==-1)
{
fprintf(stderr,"Write Error: %d\n",strerror(errno));
return 1;
}
}
close(sockfd);
return 0;
}