你的位置:首页 > 操作系统

[操作系统]6.1.2Linux下Socket编程


tcp简单实验

server.c

 

#include <sys/types.h>     /* See NOTES */#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*/#define SERVER_PORT 8888#define BACKLOG   10int main(int argc, char **argv){  int iSocketServer;  int iSocketClient;  struct sockaddr_in tSocketServerAddr;  struct sockaddr_in tSocketClientAddr;  int iRet;  int iAddrLen;    int iRecvLen;  unsigned char ucRecvBuf[1000];   //接收缓冲区  int iClientNum = -1;  signal(SIGCHLD,SIG_IGN);  //等待为子进程收尸信号    /* AF_INET为ipv4类型,SOCK_STREAM为Tcp连接类型,*/  iSocketServer = socket(AF_INET, SOCK_STREAM, 0);    if( -1 == iSocketServer)  {    printf("socket error!\n");        return -1;  }  tSocketServerAddr.sin_family   = AF_INET;  tSocketServerAddr.sin_port    = htons(SERVER_PORT);  /* host to net ,short */  tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;       /* 本机上的所有IP */  memset(tSocketServerAddr.sin_zero, 0, 8);         /* 设置无用的空间为0 */    iRet = bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));  if( -1 == iRet)  {    printf("bind error!\n");         return -1;  }  iRet = listen(iSocketServer, BACKLOG);  if( -1 == iRet)  {    printf("listen error!\n");        return -1;  }  while(1)  {    iAddrLen = sizeof(struct sockaddr);    iSocketClient = accept(iSocketServer, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);    if (-1 != iSocketClient)    {      iClientNum++;      printf("Get connect from client %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("Get Msg From Client %d: %s\n", iClientNum, ucRecvBuf);          }        }      }    }  }    close(iSocketServer);  return 0;}

 

client.c

#include <sys/types.h>     /* See NOTES */#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*/#define SERVER_PORT 8888int main(int argc, char **argv){  int iSocketClient;  struct sockaddr_in tSocketServerAddr;  int iRet;  unsigned char ucSendBuf[1000];  int iSendLen;    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);  /* host to net ,short */  if(0 == inet_aton(argv[1], &tSocketServerAddr.sin_addr)) /* 本机上的所有IP */  {    printf("invalid server_ip\n");    return -1;  }  memset(tSocketServerAddr.sin_zero, 0, 8);         /* 设置无用的空间为0 */      iRet = connect(iSocketClient, (struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));  if(iRet == -1)  {    printf("connect error!\n");        return -1;  }  while(1)  {    if(fgets(ucSendBuf, 999, stdin))    {      iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf), 0);      if(iSendLen <= 0)      {        close(iSocketClient);        return -1;      }    }  }  return 0;}