服務器端

#include<Winsock2.h>
#include
<stdio.h>
#include
<stdlib.h>
#pragma comment (lib,
"ws2_32.lib")

//服務器使用的端口號為5050
#define DEFAULT_PORT 5050
//數據緩沖區長度
#define BUFFER_LENGTH 1024

void main()
{
    
//服務器端口
    int iPort = DEFAULT_PORT;
    WSADATA wsaData;
    SOCKET sListen,sAccept;
    
//存放主機名稱
    char hostname[256];
    
//客戶地址長度
    int iLen;
    
//發送的數據長度
    int iSend;
    
//接收的數據長度
    int iRecv;
    
//發送給客戶的信息
    char send_buf[1024];
    
//接收數據的緩沖區
    char recv_buf[BUFFER_LENGTH];
    
//服務器和客戶的地址
    struct sockaddr_in ser,cli;
    PHOSTENT hostinfo;

    printf(
"--------------------------\n");
    printf(
"基于TCP的通信程序的服務器\n");
    
//加載 winsock庫
    if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
    
{
        printf(
"Failed to load Winsock.\n");
        
return;
    }


    
    
//獲得主機名
    if(gethostname(hostname,sizeof(hostname)) != 0)
    
{
        printf(
"gethostname() Error:%u\n",WSAGetLastError());
        
return;
    }
    
   
if((hostinfo = gethostbyname(hostname) )!= NULL)
   
{
    
//如果獲得主機名成功的話,調用inet_ntoa()函數取得IP地址
    LPCSTR ip = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
    printf(
"本機的IP地址 : %s\n",ip);//輸出ip地址
    printf("本機的名稱是 : %s\n",hostname);
   }

    printf(
"--------------------------\n");

    
//創建服務器端套接口
    sListen = socket(AF_INET,SOCK_STREAM,0);
    
if(sListen == INVALID_SOCKET)
    
{
        printf(
"socket() Failed:%d\n",WSAGetLastError());
        
return;
    }


    
//以下綁定服務器端地址
    ser.sin_family = AF_INET;
    
//端口號:htons()函數把一個二字節字節順序的數轉換為網絡字節順序的數
    ser.sin_port = htons(iPort);
    
//htonl()函數把一個四字節字節的數轉換為網絡系統字節順序的數
    
//使用系統指定的IP地址 INADDR_ANY
    ser.sin_addr.s_addr = htonl(INADDR_ANY);
    
if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)) == SOCKET_ERROR)
    
{
        printf(
"bind() Failed:%d\n",WSAGetLastError());
        
return;
    }


    
//進入監聽狀態
    if(listen(sListen,5== SOCKET_ERROR)
    
{
        printf(
"listen() Failed:%d\n",WSAGetLastError());
        
return;
    }


    
//初始化客戶地址長度參數
    iLen = sizeof(cli);

    
//初始化接收緩沖區
    memset(recv_buf,0,sizeof(recv_buf));

    
//進入一個無限循環,等待客戶的連接請求
    while(1)
    
{
        printf(
"等待客戶的連接請求\n");
        sAccept 
= accept(sListen,(struct sockaddr*)&cli,&iLen);

        
if(sAccept == INVALID_SOCKET)
        
{
            printf(
"accept() Failed:&d\n",WSAGetLastError());
            
break;
        }


        printf(
"建立TCP連接成功!\n");
        printf(
"--------------------------\n");

        
//進入一個無限循環,與客戶交互
        while(1){

            
//從客戶端接收數據
            iRecv = recv(sAccept,recv_buf,BUFFER_LENGTH,0);

            
if(iRecv == SOCKET_ERROR)
            
{
                printf(
"recv() Failed.:%d\n",WSAGetLastError());
                
continue;
            }

            
else if(iRecv == 0)      break;
                
else
                
{
                    
//輸出接收到的數據
                    printf("客戶端說 : %s",recv_buf);
                    
//輸出客戶IP地址和端口號
                    printf("(來自:%s:%d)\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
                }



            
//給連接的客戶發送信息
            printf("發送消息: ");
            gets(send_buf);

            iSend 
= send(sAccept,send_buf,sizeof(send_buf),0);

            
if(iSend == SOCKET_ERROR)
            
{
                printf(
"send() Failed:%d\n",WSAGetLastError());
                
break;
            }

            
else if(iSend == 0)     break;
                
else
                
{
                    printf(
"發送成功.\n");
                    printf(
"--------------------------\n");
                }

        }

            
//關閉接收套接口
            closesocket(sAccept);
    }

    
//關閉監聽套接口
    closesocket(sListen);
    
//卸載winsock庫
    WSACleanup();
}


 

客戶端

#include<Winsock2.h>
#include
<stdio.h>
#include
<stdlib.h>
#pragma comment (lib,
"ws2_32.lib")

//服務器使用的端口號為5050
#define DEFAULT_PORT 5050
#define DATA_BUFFER 1024

void main()
{
    WSADATA wsaData;
    SOCKET sClient;
    
int iPort = DEFAULT_PORT;
    
//接收數據的緩沖
    int iSend;
    
int iRecv;
    
//要發送給服務器的信息
    char send_buf[1024];
    
//接收數據的緩沖
    char recv_buf[DATA_BUFFER];
    
//服務器端地址
    struct sockaddr_in ser;

    printf(
"--------------------------\n");
    printf(
"基于TCP的通信程序的客戶端\n");

    
//提示在命令持中輸入法服務器IP地址
    printf("輸入服務器IP:");

    
char ipz[32];    
    gets(ipz);
    
//char * ipz=&ip;

    
//接收數據的緩沖區初始化
    memset(recv_buf,0,sizeof(recv_buf));

    
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
    
{
        printf(
"Failed to load Winsock.\n");
        
return;
    }


    
//填寫要連接的服務器地址信息
    ser.sin_family = AF_INET;
    ser.sin_port 
= htons(iPort);
    
//inet_addr()函數將命令持的點掃IP地址轉化為用二進制表示的網絡順序的IP地址
    
//ser.sin_addr.s_addr = inet_addr(argv[1]);
    ser.sin_addr.s_addr = inet_addr(ipz);
    
//建立客戶端流式套接口
    sClient = socket(AF_INET,SOCK_STREAM,0);

    
if(sClient == INVALID_SOCKET)
    
{
        printf(
"socket() Failed:%d\n",WSAGetLastError());
        
return;
    }


    
//請求與服務器端建立TCP連接
    if(connect(sClient,(struct sockaddr*)&ser,sizeof(ser)) == INVALID_SOCKET)
    
{
        printf(
"connect() Failed.:%d\n",WSAGetLastError());
        
return;
    }

    
else
    
{
        printf(
"建立TCP連接成功!\n");
        printf(
"--------------------------\n");

        
//進入一個無限循環,與服務器交互
        while(1){

            
//向服務器發送數據

            printf(
"發送消息:");
            gets(send_buf);

            iSend 
= send(sClient,send_buf,sizeof(send_buf),0);

            
if(iSend == SOCKET_ERROR)
            
{
                printf(
"send() Failed:%d\n,WSAGetLastError()");
                    
return;
            }

            
else if(iSend == 0)
                
return;
                
else
                    printf(
"發送成功.\n");


            
//從服務器端接收數據
            iRecv = recv(sClient,recv_buf,sizeof(recv_buf),0);

            
if(iRecv == SOCKET_ERROR)
            
{
                printf(
"recv() Failed:%d\n",WSAGetLastError());
                
return;
            }

            
else if(iRecv == 0)
                
return;
                
else
                
{
                    
//顯示從服務器收到的信息
                    printf("服務器說:%s\n",recv_buf);
                    printf(
"--------------------------\n");
                }

        }

    }


    closesocket(sClient);
    WSACleanup();
}