基于TCP协议的socket编程实例

来源:互联网 发布:matlab的mac版本 编辑:程序博客网 时间:2024/05/21 15:45

基于TCP协议的socket编程实例

l  实例编译环境为Microsoft Visual Studio 2010

//****************************Server.c**********************************//

#define WIN32

#include <windows.h>

#include <winsock.h>

#pragma comment(lib,"ws2_32.lib")

#include <stdio.h>

#include <string.h>

#define PROTOPORT       5193          

#define QLEN            6             

int     visits      =   0;            

 

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

    struct  hostent  *ptrh;     

    struct  protoent *ptrp;    

    struct  sockaddr_in sad; 

    struct  sockaddr_in cad; 

    int     sd, sd2;                 

    int     port;                     

    int     alen;                    

    char    buf[1000];         

#ifdef WIN32

    WSADATA wsaData;

    WSAStartup(0x0101, &wsaData);

#endif

    memset((char *)&sad,0,sizeof(sad));     

    sad.sin_family = AF_INET;                    

    sad.sin_addr.s_addr = INADDR_ANY;

    if (argc > 1) {                

       port = atoi(argv[1]);  

    } else {

       port = PROTOPORT;     

    }

    if (port > 0){                  

       sad.sin_port = htons((u_short)port);}

    else{                         

       fprintf(stderr,"bad port number %s\n",argv[1]);

       exit(1);

    }      

    if ( ((int)(ptrp = getprotobyname("tcp"))) == 0) {

       fprintf(stderr, "cannot map \"tcp\" to protocol number");

       exit(1);

    }

    /* Create a socket */

    sd = socket(PF_INET, SOCK_STREAM, ptrp->p_proto);

    if (sd < 0) {

       fprintf(stderr, "socket creation failed\n");

       exit(1);

    }

    if (bind(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) {

       fprintf(stderr,"bind failed\n");

       exit(1);

    }

    if (listen(sd, QLEN) < 0) {

       fprintf(stderr,"listen failed\n");

       exit(1);

    }

    while (1) {

       alen = sizeof(cad);

       if ( (sd2=accept(sd, (struct sockaddr *)&cad, &alen)) < 0)

       {

           fprintf(stderr, "accept failed\n");

           exit(1);

       }

       visits++;

       printf("Accepted  client IP:[%s],port:[%d]\n ", inet_ntoa (cad.sin_addr),ntohs(cad.sin_port));

       sprintf(buf,"This server has been contacted %d time%s\n",

       visits,visits==1?".":"s.");

       iSend=send(sd2,buf,strlen(buf),0);

       printf("send() byte:%d\n",iSend);

       closesocket(sd2);

    }

}

//***********************client.c************************************//

#define WIN32

#include <windows.h>

#include <winsock.h>

#pragma comment(lib,"ws2_32.lib")//vs2010中添加此库函数

#include <io.h>

#include <stdio.h>

#include <string.h>

#define PROTOPORT       5193

extern  int     errno;

char    localhost[] =   "localhost";

 

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

    struct  hostent  *ptrh;  

    struct  protoent *ptrp;

    struct  sockaddr_in sad;

int     sd;      

int     port;  

char  *host; 

int      n;  

char  buf[1000];

#ifdef WIN32

    WSADATA wsaData;

    WSAStartup(0x0101, &wsaData);

#endif

    memset((char *)&sad,0,sizeof(sad));

    sad.sin_family = AF_INET;            

    if (argc > 2) {                

       port = atoi(argv[2]); 

    } else

    {

       port = PROTOPORT;      

    }

    if (port > 0)                  

       sad.sin_port = htons((u_short)port);

    else {                         

       fprintf(stderr,"bad port number %s\n",argv[2]);

       exit(1);

    }

    if (argc > 1) {

       host = argv[1];      

    } else {

       host = localhost;

    }

    ptrh = gethostbyname(host);

    if ( ((char *)ptrh) == NULL ) {

       fprintf(stderr,"invalid host: %s\n", host);

       exit(1);

    }

    memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);

    if ( ((int)(ptrp = getprotobyname("tcp"))) == 0) {

       fprintf(stderr, "cannot map \"tcp\" to protocol number");

       exit(1);

    }

    /* Create a socket. */

    sd = socket(PF_INET, SOCK_STREAM, ptrp->p_proto);

    if (sd < 0) {

       fprintf(stderr, "socket creation failed\n");

       exit(1);

    }

    if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) {

       fprintf(stderr,"connect failed\n");

       exit(1);

    }

    n = recv(sd, buf, sizeof(buf), 0);

    while (n > 0) {

       write(1,buf,n);

printf("recv() data from server:\n%s\n",buf);

       n = recv(sd, buf, sizeof(buf), 0);

    }

    closesocket(sd);

    exit(0);

}

l  实例执行结果:

1和图2分别是客户端程序和服务器端程序执行结果,它们是在同一台主机上执行的结果。该主机的IP地址设置为“58.154.232.29”。客户端程序共执行3次,每执行一次服务器端程序就显示与其建立连接的客户端IP地址和端口号,并显示发送的给客户端的字节数。(每次执行时,主机都分配了不同的端口号)

 

1 客户端程序执行结果

2012年10月15日 - 梦幻骑士 - 梦幻骑士

 

2 服务器端程序执行结果

2012年10月15日 - 梦幻骑士 - 梦幻骑士