windows下: client/server

#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")

int main(int argc, char* argv[])
{
    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %ld\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for
    // incoming connection requests.
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    sockaddr_in addrServer;
    addrServer.sin_family = AF_INET;
    addrServer.sin_addr.s_addr = htonl(INADDR_ANY); //实际上是0
    addrServer.sin_port = htons(20131);


    //绑定套接字到一个IP地址和一个端口上
    if (bind(ListenSocket,(SOCKADDR *) & addrServer, sizeof (addrServer)) == SOCKET_ERROR) {
        wprintf(L"bind failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    //将套接字设置为监听模式等待连接请求
    //----------------------
    // Listen for incoming connection requests.
    // on the created socket
    if (listen(ListenSocket, 5) == SOCKET_ERROR) {
        wprintf(L"listen failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    SOCKADDR_IN addrClient;
    int len=sizeof(SOCKADDR);
    //以一个无限循环的方式,不停地接收客户端socket连接
    while(1)
    {
        //请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字
        SOCKET AcceptSocket=accept(ListenSocket,(SOCKADDR*)&addrClient,&len);
        if(AcceptSocket  == INVALID_SOCKET)break; //出错
        //接收缓冲区的大小是50个字符
        char recvBuf[51];
        while(1){
            memset(recvBuf,0,50);
            int count =recv(AcceptSocket ,recvBuf,50,0);
            if(count==0)break;//被对方关闭
            if(count< 0)break;//错误count<0
            int sendCount,currentPosition=0;
            while((sendCount=send(AcceptSocket ,recvBuf+currentPosition,count,0))!=SOCKET_ERROR)
            {
                if(sendCount <= 0) break;
                count-=sendCount;
                currentPosition+=sendCount;
            }
            if(sendCount==SOCKET_ERROR)break;

            printf("%s %s/n",inet_ntoa(addrClient.sin_addr),recvBuf);
          //  printf("%s",recvBuf);
        }
        //结束连接
       closesocket(AcceptSocket);
    }

    closesocket(ListenSocket);
    WSACleanup();
    return 0;
}

#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#include <io.h>
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")

int main(int argc, char* argv[])
{
    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %ld\n", iResult);
        return 1;
    }

    //----------------------
    // Create a SOCKET for connecting to server
    SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    sockaddr_in addrServer;
    addrServer.sin_family = AF_INET;
    addrServer.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    addrServer.sin_port = htons(20131);

    //----------------------
    // Connect to server.
    iResult = connect( ConnectSocket, (SOCKADDR*) &addrServer, sizeof(addrServer) );
    if ( iResult == SOCKET_ERROR) {
        closesocket (ConnectSocket);
        printf("Unable to connect to server: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    char buf[1024+1];
    //以一个无限循环的方式,不停地接收输入,发送到server
    while(1)
    {
        int count = _read (0, buf, 1024);//从标准输入读入
        if(count<=0)break;
        int sendCount,currentPosition=0;
        while((sendCount=send(ConnectSocket ,buf+currentPosition,count,0))!=SOCKET_ERROR)
        {
            if(sendCount <= 0) break;
            count-=sendCount;
            currentPosition+=sendCount;
        }
        if(sendCount==SOCKET_ERROR)break;
        memset(buf,0,1024);
        count =recv(ConnectSocket ,buf,1024,0);
        if(count==0)break;//被对方关闭
        if(count==SOCKET_ERROR)break;//错误count<0
        buf[count]='\0';
        printf("%s",buf);
    }
    //结束连接
    closesocket(ConnectSocket);
    WSACleanup();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值