在linux下,可以利用socket通信建立起简单的聊天协议,以下就是运行在linux下的简单聊天通信,分为服务端server.c和客户端client.c。
//server.c - gcc -o s server.c
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#define EHCO_PORT 8080
#define MAX_CLLENT_NUM 10
int main()
{
int sock_fd;
struct sockaddr_in serv_addr;
int clientfd;
struct sockaddr_in clientAdd;
char buff[101];
socklen_t len;
int n;
/*socket*/
sock_fd=socket(AF_INET,SOCK_STREAM,0);
if(sock_fd==-1){
perror("creket socket error!");
return 0;
}
else{
printf("success to create socket %d\n",sock_fd);
}
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(EHCO_PORT);
serv_addr.sin_addr.s_addr=htons(INADDR_ANY);
bzero(&(serv_addr.sin_zero),8);
if(bind(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))!=0){
printf("bind address fail!%d\n", errno);
close(sock_fd);
return 0;
}else{
printf("success to bind address!\n");
}
if(listen(sock_fd,MAX_CLLENT_NUM)!=0){
perror("listen socket error !\n");
close(sock_fd);
return 0;
}else{
printf("success to listen!\n");
}
len =sizeof(clientAdd);
clientfd=accept(sock_fd,(struct sockaddr*)&clientAdd,&len);
if(clientfd<=0)
{
perror("accept() error!\n");
close(sock_fd);
return 0;
}
while((n=recv(clientfd,buff,100,0))>0){
buff[n]='\0';
printf("number of receive bytes=%d data =%s\n",n,buff);
fflush(stdout);
send(clientfd,buff,n,0);
if(strncmp(buff,"quit",4)==0)
break;
}
close(clientfd);
close(sock_fd);
return 0;
}
//client - gcc -o client.c
#include<sys/types.h>#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#define EHCO_PORT 8080
#define MAX_COMMAND 5
int main()
{
int sock_fd;
struct sockaddr_in serv_addr;
char *buff[MAX_COMMAND]={"abc","def","test","hello","quit"};
char tmp_buf[100];
int n,i;
sock_fd =socket(AF_INET,SOCK_STREAM,0);
if(sock_fd==-1){
perror("create socket error!\n");
return 0;
}
else{
printf("success to create socket %d\n",sock_fd);
}
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(EHCO_PORT);
serv_addr.sin_addr.s_addr=htons(INADDR_ANY);
bzero(&(serv_addr.sin_zero),8);
if(-1==connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))){
perror("connect() error!\n");
close(sock_fd);
return 0;
}
printf("success connect to server!\n");
for(i=0;i<MAX_COMMAND;i++)
{
send(sock_fd,buff[i],100,0);
n=recv(sock_fd,tmp_buf,100,0);
tmp_buf[n]='\0';
printf("data sent:%s receive:%s\n",buff[i],tmp_buf);
if(0==strncmp(tmp_buf,"quit",4))
break;
}
close(sock_fd);
return 0;
}