文档库 最新最全的文档下载
当前位置:文档库 › socket网络编程小例子

socket网络编程小例子

socket网络编程小例子
socket网络编程小例子

服务器端程序:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define PORT 2370

#define BACKLOG 2

#define IP "127.0.0.1"

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,0);

if(ss<0)

{

printf("socket error\n");

return -1;

}

//设置服务器端的地址,端口等

server_addr.sin_family = AF_INET;

server_addr.sin_port = htons(PORT);

server_addr.sin_addr.s_addr = INADDR_ANY;

bzero(&(server_addr.sin_zero), 8);

//将创建的套接字绑定到服务器端

err = bind(ss, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); 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);

sc=accept(ss,(struct sockaddr*)&client_addr,&addrlen);//如果调用成功,https://www.wendangku.net/doc/4515231759.html,将返回一个新的套接字与客户端通信

printf("%s has connected 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));//调用子进

程通信函数

}

else

{

close(sc);

}

}

}

void process_conn_server(int s,char *ip)

{

char buffer[1024];

while(1)

{

memset(buffer,'\0',1024); //置空

recv(s,buffer,1024,0);//接收消息https://www.wendangku.net/doc/4515231759.html,

if(strncmp("end",buffer,3)==0)//判断是否符合退出条件

{

printf("%s has lost connect\n",ip);

close(s);

exit(EXIT_SUCCESS);

}

printf("%s say :%s\n",ip,buffer);

//统计客户端输出的字符个数并发送给客户端

sprintf(buffer,"%d characters altogether",strlen(buffer)-1); send(s,buffer,1024,0);

}

}

客户端程序:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define IP "127.0.0.1"

#define PORT 2370

#define TEST

void process_conn_client(int s);

void signal_g();

int main(int argc,char *argv[])

{

int s;

struct sockaddr_in server_addr;

int err;

//创建套接字

s=socket(AF_INET,SOCK_STREAM,0);

if(s<0)

{

printf("socket erro\n");

return -1;

}

//设置服务器端的地址,端口等

server_addr.sin_family=AF_INET;

server_addr.sin_addr.s_addr=inet_addr(IP);//字符串类型转IP类型

server_addr.sin_port=htons(PORT);

bzero(&(server_addr.sin_zero),8);

#ifndef TEST

printf("a");

#endif

connect(s,(struct sockaddr *)&server_addr,sizeof(struct sockaddr));//连接服务器

#ifndef TEST

printf("b");

#endif

process_conn_client(s);

close(s);

}

void process_conn_client(int s)

{

ssize_t size=0;

char buffer[1024];

signal(SIGINT ,signal_g);//捕捉中断信号(Ctrl+C键),使必须输入“end”才能结束

while(1)

{

memset(buffer,'\0',1024);

fgets(buffer,1024,stdin);

send(s, buffer, 1024, 0);

if(strncmp("end",buffer,3)==0)

{

break;

}

memset(buffer,'\0',1024);

recv(s,buffer,1024,0);//接收服务器端发来的信息

printf("%s\n",buffer);

}

}

void signal_g()//信号处理函数

{

signal(SIGINT,SIG_IGN);

}

Linux下测试结果如下图(程序只支持由客户端向服务器发数据,其他功能读者自行添加)

相关文档