List item
socket服务器客户端代码详细解析见我的另一篇博客socket网络编程
服务器端程序
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<ctype.h>
#include<strings.h>
#include<sys/wait.h>
#include<signal.h>
#include<string.h>
#include<errno.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666
void wait_child(int signo
)
{
while(waitpid(0,NULL,WNOHANG
)>0);
return;
}
ssize_t
Read(int fd
,void *ptr
,size_t nbytes
)
{
ssize_t n
;
again
:
if( (n
= read(fd
,ptr
,nbytes
))==-1)
{
if(errno
==EINTR
)
goto again
;
else
return -1;
}
return n
;
}
int main()
{
pid_t pid
;
int ret
;
int lfd
,cfd
;
struct sockaddr_in serv_addr
, clie_addr
;
socklen_t clie_addr_len
;
char buf
[BUFSIZ
],clie_ip
[BUFSIZ
];
char s_ip
[BUFSIZ
];
int port
;
lfd
=socket(AF_INET
,SOCK_STREAM
,0);
if(lfd
==-1)
{
perror("socket error");
exit(1);
}
bzero(&serv_addr
,sizeof(serv_addr
));
serv_addr
.sin_family
=AF_INET
;
serv_addr
.sin_port
=htons(SERV_PORT
);
serv_addr
.sin_addr
.s_addr
=htonl(INADDR_ANY
);
ret
=bind(lfd
,(struct sockaddr
*)&serv_addr
,sizeof(serv_addr
));
if(ret
==-1)
{
perror("bind error");
exit(1);
}
listen(lfd
,128);
while(1)
{
clie_addr_len
=sizeof(clie_addr
);
cfd
=accept(lfd
,(struct sockaddr
*)&clie_addr
,&clie_addr_len
);
printf("client ip=%s , port= %d\n",
inet_ntop(AF_INET
,&clie_addr
.sin_addr
.s_addr
,clie_ip
,sizeof(clie_ip
)),
ntohs(clie_addr
.sin_port
) );
if(cfd
==-1)
{
perror("accept error");
exit(1);
}
pid
=fork();
if(pid
<0)
{
perror("fork error");
exit(1);
}
else if(pid
==0)
{
strcpy(s_ip
,clie_ip
);
port
=ntohs(clie_addr
.sin_port
);
close(lfd
);
break;
}
else
{
close(cfd
);
signal(SIGCHLD
,wait_child
);
}
}
if(pid
==0)
{
int n
;
while(1)
{
n
=Read(cfd
,buf
,sizeof(buf
));
if(n
==0)
{
close(cfd
);
return 0;
}
else if(n
==-1)
{
perror("read error");
exit(1);
}
else
{
printf("Read %s , from client, ip:%s , port:%d------",buf
,s_ip
,port
);
for(int i
=0;i
<n
;i
++)
buf
[i
]=toupper(buf
[i
]);
write(cfd
,buf
,n
);
printf("write to client : %s:\n",buf
);
}
}
}
return 0;
}
客户端
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<string.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666
int main()
{
int cfd
,sfd
;
struct sockaddr_in serv_addr
;
socklen_t serv_addr_len
;
char buf
[BUFSIZ
],clien_ip
[BUFSIZ
];
int n
;
char *find
;
memset(&serv_addr
,0,sizeof(serv_addr
));
serv_addr
.sin_family
=AF_INET
;
serv_addr
.sin_port
=htons(SERV_PORT
);
inet_pton(AF_INET
,SERV_IP
,&serv_addr
.sin_addr
.s_addr
);
cfd
=socket(AF_INET
,SOCK_STREAM
,0);
connect(cfd
,(struct sockaddr
*)&serv_addr
,sizeof(serv_addr
) );
while(1)
{
fgets(buf
,sizeof(buf
),stdin);
find
=strchr(buf
,'\n');
if(find
)
*find
='\0';
write(cfd
,buf
,strlen(buf
));
n
=read(cfd
,buf
,sizeof(buf
));
write(STDOUT_FILENO
,buf
,n
);
printf("\n");
}
close(cfd
);
return 0;
}
结果如下:
客户端1 客户端2 服务器端:
转载请注明原文地址: https://lol.8miu.com/read-33582.html