小记最简单的socket服务器端和客户端的代码编写(C版和python版)

C版:

server端

#include"winsock2.h"  

#include<stdio.h>  
#include<stdlib.h>  
#define   DEFAULT_PORT     6789  
#define   DEFAULT_COUNT   25  
#define   DEFAULT_BUFFER   4096  

int   iPort   =   DEFAULT_PORT   ;   //port   to   listen   for   clients   on    
BOOL   bInterface   =   FALSE,   //Listen   on   the   specified   interface  
bRecvOnly   =   FALSE;       //Recive   data   only;   don't   echo   back  
char   szAddress[128];             //Interface   to   listen   for   clients   on    


struct myListenSocket
{
    char clientIp[255];
    int port;
    SOCKET conSocket;
};

//  
//Fuction:ClientThread  
//  
//Descripton:  
//           This   function   is   called   as   a   thread,   and   it   handles   a   given  
//           client   connection.   The   parameter   passed   in   is   the   socket  
//           handle   returned   frome   an   accept()   call.   This   function   reads    
//           data   from   the   client   and   writes   it   back.  
//  
DWORD   WINAPI   ClientThread(LPVOID   lpParam)  
{  
    myListenSocket     *sock   =   (myListenSocket*)lpParam;  
    char         szBuff[DEFAULT_BUFFER];  
    int           ret,  
        nLeft,  
        idx;  
    while(1)  
    {  
        //   Perform   a   blocking   recv()   call  
        //  
        ret   =   recv(sock->conSocket,szBuff,DEFAULT_BUFFER,0);  
        if(ret   ==   0)                                 //Graceful   close  
            break;  
        szBuff[ret]   =   '/0';  
        printf("RECV from (%s , %d):   '%s'/n",sock->clientIp,sock->port,szBuff); 
        send(sock->conSocket,"收到",10,0);

    }  
    return   0;  
}  
//  
//Function   :   main  
//  
//Description:  
//     Main   thread   of   execution.   Initialize   Winsock,parse   the  
//     command   line   arguments   ,create   the   listening   socket,bind  
//     to   the   lcoal   address,   and   wait   for   client   connections.  
//  
int   main(int   argc,char   **argv)  
{  
    WSADATA   wsd;  
    SOCKET     sListen,  
        sClient;  
    int   iAddrSize;  
    HANDLE     hThread;  
    DWORD       dwThreadId;  
    struct   sockaddr_in   local,  
        client;   
    struct myListenSocket* mls=new myListenSocket();
    if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)  
    {  
        printf("Failed   to   load   Winsock!/n");  
        return   1;  
    }  
    //Crate   our   listening   socket  
    //  
    sListen     =   socket(AF_INET,SOCK_STREAM,IPPROTO_IP);  
    if(sListen   ==   SOCKET_ERROR)  
    {  
        printf("socket()   failed:%d/n",WSAGetLastError());  
        return   1;  
    }  
    //Select   the   local   interface   ,and   bind   to   it  
    //  
    if(bInterface)  
    {  
        local.sin_addr.s_addr   =   inet_addr(szAddress);   
    }  
    else  
        local.sin_addr.s_addr   =   htonl(INADDR_ANY);  
    local.sin_family   =   AF_INET;  
    local.sin_port   =   htons(iPort);  

    if(bind(sListen,(struct   sockaddr   *)&local,sizeof(local))   ==   SOCKET_ERROR)  
    {  
        printf("bind()   failed:%d/n",WSAGetLastError());      
        return   1;  
    }  
    listen(sListen,8);  
    //  
    //In   a   continuous   loop,wait   for   incoming   clients.Once   one    
    //   is   detected,create   a   thread   and   pass   teh   handle   off   to   it.  
    //  
    while(1)  
    {  
        iAddrSize   =   sizeof(client);  
        sClient   =   accept(sListen,(struct   sockaddr   *)&client,&iAddrSize);  
        if(sClient   ==   INVALID_SOCKET)  
        {  
            printf("accept()   failed:%d/n",WSAGetLastError());  
            break;  
        }  
        printf("ACCEpted   clients:%s:%d/n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
        strcpy(mls->clientIp,inet_ntoa(client.sin_addr));
        mls->port=ntohs(client.sin_port);
        mls->conSocket=sClient;
        hThread   =   CreateThread(NULL,0,ClientThread,(LPVOID)mls,0,&dwThreadId);  
        if(hThread   ==   NULL)  
        {  
            printf("CreateThread()   failed:%d/n",WSAGetLastError());  
            break;  
        }  
        CloseHandle(hThread);  
    }  
    closesocket(sListen);  
    WSACleanup();  
    return   0;  
}  

 

 

/client端

#include <WinSock2.h>
#include "stdio.h"

int port=6789;
char szIp[255]="127.0.0.1";


int _tmain(int argc, _TCHAR* argv[])
{
    SOCKET client;
    WSADATA wsa;
    sockaddr_in addr;
    if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
        printf("WSAStartup error!/n");
    client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    addr.sin_family=AF_INET;
    addr.sin_port=htons(port);
    addr.sin_addr.s_addr=inet_addr(szIp);
    if(connect(client,(struct sockaddr *)&addr,sizeof(addr))!=0)
        printf("connect error/n");
    for(int i=0;i<10;i++)
    {
        send(client,szIp,strlen(szIp),0);
        Sleep(10);
    }

    WSACleanup();

    getchar();

 return 0;
}

 

 

 

python版:

//服务器端

from socket import *

host='127.0.0.1'
listenport=50001
server=socket(AF_INET,SOCK_STREAM)
server.bind((host,listenport))
server.listen(10)
while True:
    conn,address=server.accept()
    print 'server connceted by',address
    while True:
        data=conn.recv(512)
        if not data:
            break
        print address,':',data
        conn.send('Echo from server:'+data)
    conn.close()

 

 

/客户端

from socket import *
host='127.0.0.1'
serverport=50000
msg='how are you!'
client=socket(AF_INET,SOCK_STREAM)
client.connect((host,serverport))
for ch in msg:
    client.send(ch)
    data=client.recv(1024)
    print 'receive from server:',data
client.close()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用中提到,">>" 和 ">>=" 是位运算符。位运算符是对二进制数进行操作的运算符。">>" 是右移运算符,将数字的二进制表示向右移动指定的位数。">>=" 是右移赋值运算符,将右移后的结果赋值给左侧的变量。 引用中提到,比较运算符的返回值是布尔值(True 或 False)。在Python中,">" 表示大于,"<" 表示小于,">=" 表示大于等于,"<=" 表示小于等于。我们可以使用这些比较运算符来比较两个变量的大小关系。 引用中给出了一些示例,展示了如何使用比较运算符进行比较。例如,"num == str1" 判断变量 num 是否等于字符串 str1,如果相等则返回 True,否则返回 False。另外,"str > str2" 比较字符串 str 和 str2 的大小,根据字母的 ASCII 码值进行比较。 所以,"python >>" 表示将一个数字的二进制表示向右移动指定的位数,而 "python >>=" 表示将右移后的结果赋值给左侧的变量。这些运算符可以用于对二进制数的位操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python小记(六):python:“<<=” 和 “>>=”位运算符(可能会更新)](https://blog.csdn.net/xzs1210652636/article/details/119955801)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python比较运算符:==、!=、>、、>=、<=](https://blog.csdn.net/qq_32591415/article/details/111761772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值