服務器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <strings.h>
#include <errno.h>
#define BACKLOG 2
//#include <libxml/parser.h>
//#include <libxml/tree.h>
void process_conn_server(int s, char *ip);
int main(int argc, char *argv[])
{
int ss,sc;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int err;
pid_t pid;
//創建套接字
ss=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (ss<0)
{
printf("socket error\n");
return -1;
}
//設置服務器端口的地址
//memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(1000);
server_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(server_addr.sin_zero),8);
//綁定套接字
err = bind(ss,(struct sockaddr *)&server_addr,sizeof(server_addr));
if (err<0)
{
printf("bind error\n");
return -1;
}
//監聽套接字
err=listen(ss,BACKLOG);
if (err<0)
{
printf("listen error\n");
return -1;
}
//主循環
for (;;)
{
//int addrlen=sizeof(struct sockaddr);
socklen_t addrlen=sizeof(struct sockaddr);
sc=accept(ss,(struct sockaddr*)&client_addr,&addrlen);//如果調用成功,將返回一個新的套接字與客戶端通信
printf("%s has connect success\n",inet_ntoa(client_addr.sin_addr));
if (sc<0)
{
continue;
}
pid=fork();//創建一個進程與客戶端通信
if (pid==0)
{
close(ss);
process_conn_server(sc,inet_ntoa(client_addr.sin_addr));//調用子進程通信函數
}
if(pid!=0)
{
close(sc);
}
}
}
void process_conn_server(int s, char *ip)
{
char buffer[1024*512];
while (1)
{
memset(buffer,0,sizeof(buffer));
recv(s,buffer,1024*512,0);
//if (strncmp("end",buffer,3)==0)
//{
printf("%s say :%s\n",ip,buffer);
//統計客戶端輸出的字符個數併發給客戶端
sprintf(buffer,"%d characters altogether",strlen(buffer)-1);
send(s,buffer,1024*512,0);
}
}
客戶端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <strings.h>
#include <errno.h>
#include <signal.h>
#define TEST
void process_conn_client(int s);
void signal_g();
int main()
{
int s;
struct sockaddr_in server_addr;
int err;
//創建套接字
s=socket(AF_INET,SOCK_STREAM,0);
if (s<0)
{
printf("socket error\n");
return -1;
}
//設置服務器端口
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=INADDR_ANY;
server_addr.sin_port=htons(1000);
bzero(&(server_addr.sin_zero),8);
#ifndef TEST
printf("a");
#endif
connect(s,(struct sockaddr *)&server_addr,sizeof(server_addr));
#ifndef TEST
printf("b");
#endif
process_conn_client(s);
close(s);
}
void process_conn_client(int s)
{
ssize_t size=0;
char buffer[1024*512];
//signal(SIGINT,signal_g);
while (1)
{
memset(buffer,'\0',sizeof(buffer));
fgets(buffer,1024*512,stdin);
send(s,buffer,1024*512,0);
memset(buffer,'\0',1024*512);
recv(s,buffer,sizeof(buffer),0);
printf("%s\n",buffer);
}
}