memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
srv_addr.sin_port=htons(port);
ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret == -1){
perror("不能捆绑端口");
close(listen_fd);
return 1;
//监听指定端口,连接5个客户端
ret=listen(listen_fd,5);
if(ret==-1){
perror("不能监听端口");
close(listen_fd);
return 1;
while (1){
len=sizeof(clt_addr);
com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
if(com_fd<0){
if(errno == EINTR){
continue;
}else{
perror("不能返回结果");
close(listen_fd);
return 1;
pid=fork();//多进程
if(pid<0){
perror("不能创建子进程!");
close(listen_fd);
return 1;
}else if(pid == 0){
while((len=read(com_fd,recv_buf,1024))>0){
printf("连接端信息:(%d):%s\n",len,recv_buf);
if(recv_buf[0]=='@')
break;
for(i=0;i<len;i++)
recv_buf[i]=toupper(recv_buf[i]);
write(com_fd,recv_buf,len);
close(com_fd);
return 0;
}else
close(com_fd);
return 0;
客户端代码如下:
//客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netdb.h>
#include <unistd.h>
int main(int argc,char *argv[])
int connect_fd;
int ret;
char snd_buf[1024];
int i;
int port;
int len;
static struct sockaddr_in srv_addr;
if(argc!=3){
printf("exp: %s server_ip port\n",argv[0]);
return 1;
port=atoi(argv[2]);
connect_fd=socket(PF_INET,SOCK_STREAM,0);
if(connect_fd<0){
perror("Cannot create communication socket");
return 1;
memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=inet_addr(argv[1]);
srv_addr.sin_port=htons(port);
//连接到服务器
ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==-1){
perror("Cannot connect to the server");
close(connect_fd);
return 1;
memset(snd_buf,0,1024);
while(1){
write(STDOUT_FILENO,"In put some Message",14);
len=read(STDIN_FILENO,snd_buf,1024);
if(len>0)
write(connect_fd,snd_buf,len);
len=read(connect_fd,snd_buf,len);
if(len>0)
printf("The message from Server %s\n",snd_buf);
if(snd_buf[0] == '@')
break;
close(connect_fd);
return 0;
运行如下图:
代码来自《LINUX编程技术详解》。PS:Vim快把电脑的空格键用坏了,囧。