您的位置:首页 > 运维架构 > Linux

6.1.2Linux下Socket编程

2016-04-08 16:50 169 查看
tcp简单实验

server.c

#include<sys/types.h>/*SeeNOTES*/
#include<sys/socket.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<signal.h>

/*socket
*bind
*listen
*accept
*send/recv
*/

#defineSERVER_PORT8888
#defineBACKLOG10

intmain(intargc,char**argv)
{
intiSocketServer;
intiSocketClient;
structsockaddr_intSocketServerAddr;
structsockaddr_intSocketClientAddr;
intiRet;
intiAddrLen;

intiRecvLen;
unsignedcharucRecvBuf[1000];//接收缓冲区

intiClientNum=-1;

signal(SIGCHLD,SIG_IGN);//等待为子进程收尸信号

/*AF_INET为ipv4类型,SOCK_STREAM为Tcp连接类型,*/
iSocketServer=socket(AF_INET,SOCK_STREAM,0);

if(-1==iSocketServer)
{
printf("socketerror!\n");
return-1;
}

tSocketServerAddr.sin_family=AF_INET;
tSocketServerAddr.sin_port=htons(SERVER_PORT);/*hosttonet,short*/
tSocketServerAddr.sin_addr.s_addr=INADDR_ANY;/*本机上的所有IP*/
memset(tSocketServerAddr.sin_zero,0,8);/*设置无用的空间为0*/
//配置本地信息
iRet=bind(iSocketServer,(conststructsockaddr*)&tSocketServerAddr,sizeof(structsockaddr));
if(-1==iRet)
{
printf("binderror!\n");
return-1;
}
//最大监听个数BACKLOG
iRet=listen(iSocketServer,BACKLOG);
if(-1==iRet)
{
printf("listenerror!\n");
return-1;
}

while(1)
{
iAddrLen=sizeof(structsockaddr);
iSocketClient=accept(iSocketServer,(structsockaddr*)&tSocketClientAddr,&iAddrLen);
if(-1!=iSocketClient)
{
iClientNum++;
printf("Getconnectfromclient%d:%s\n",iClientNum,inet_ntoa(tSocketClientAddr.sin_addr));
if(!fork())
{
/*子进程的源码*/
while(1)
{
/*接收客户端信息并打印出来*/
iRecvLen=recv(iSocketClient,ucRecvBuf,999,0);
if(iRecvLen<=0)
{
close(iSocketClient);
return-1;
}
else
{
ucRecvBuf[iRecvLen]='\0';
printf("GetMsgFromClient%d:%s\n",iClientNum,ucRecvBuf);
}
}
}
}
}

close(iSocketServer);
return0;
}


client.c

#include<sys/types.h>/*SeeNOTES*/
#include<sys/socket.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<signal.h>

/*socket
*connet
*send/recv
*/
#defineSERVER_PORT8888

intmain(intargc,char**argv)
{
intiSocketClient;
structsockaddr_intSocketServerAddr;

intiRet;
unsignedcharucSendBuf[1000];
intiSendLen;

if(argc!=2)
{
printf("Usage:\n");
printf("%s<server_ip>\n",argv[0]);
return-1;
}

iSocketClient=socket(AF_INET,SOCK_STREAM,0);

tSocketServerAddr.sin_family=AF_INET;
tSocketServerAddr.sin_port=htons(SERVER_PORT);/*hosttonet,short*/
if(0==inet_aton(argv[1],&tSocketServerAddr.sin_addr))/*本机上的所有IP*/
{
printf("invalidserver_ip\n");
return-1;
}
memset(tSocketServerAddr.sin_zero,0,8);/*设置无用的空间为0*/

iRet=connect(iSocketClient,(structsockaddr*)&tSocketServerAddr,sizeof(structsockaddr));

if(iRet==-1)
{
printf("connecterror!\n");
return-1;
}

while(1)
{
if(fgets(ucSendBuf,999,stdin))
{
iSendLen=send(iSocketClient,ucSendBuf,strlen(ucSendBuf),0);
if(iSendLen<=0)
{
close(iSocketClient);
return-1;
}
}
}

return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航