您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14154|回复: 1
打印 上一主题 下一主题

[C] 一个简单的C语言的socket服务器和客户端程序

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:14:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。7 z$ Y2 @# z+ h% }; s3 \) W1 {% G
客户端程序:client.cpp
2 c) N) ]: G8 N" W
  1. #include <winsock2.h>- e8 H/ J. p( c6 p
  2. #include <stdio.h>$ P2 a! M, t$ v% n% [
  3. #include <stdlib.h>/ |( \( A! M6 G9 K: ]
  4. 4 t: J0 m; X( s/ B. X+ @
  5. #define DEFAULT_PORT       5150
    2 K! z5 }6 Q. s3 H2 S5 d; F
  6. #define DEFAULT_BUFFER     2048
    5 c; t5 q- y8 A: W, y

  7. 3 Y$ x( i' O8 C- ?& ?
  8. char  szServer[128],
    , E. o! I* Y) u/ P$ d
  9.      szMessage[1024];
    0 F' P3 w4 u3 R0 E9 B5 |
  10. int  iPort    = DEFAULT_PORT;
    # C2 q" g5 r$ a5 s! d
  11. 9 [+ c. N0 T% \2 M
  12. int main()7 d% m" o  j* {- X# r
  13. {
    * b& T) S+ @' l- c+ }4 y
  14.    WSADATA      wsd;2 L7 o) K$ _9 d, V
  15.    SOCKET       sClient;; i9 R7 t: U8 Z* ~- m7 O
  16.    char         szBuffer[DEFAULT_BUFFER];
    8 a) n, Y" \7 U' p  x
  17.    int          ret;6 j4 W2 c  O) @6 D# G1 s
  18.     struct sockaddr_in server;0 P2 s& |% U' `+ _% L; c
  19.     struct hostent    *host = NULL;
    + T0 u3 _6 z) D+ Q0 \8 W! g
  20.     if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)8 M' S$ E* T% c( M7 F0 Z
  21.     {
    3 A1 K# ~: M, A& u! }9 n% `
  22.        printf("Failed to load Winsock library!\n");
    ( q3 T) I* U8 E. F  v, q; I. x
  23.        return 1;, g$ ~7 Q' O0 K# \/ H! W
  24.     }
    , Y$ V, _/ |) q
  25.    printf("Enter a string to send to server:\n");
    ( d% B  W0 G7 D- i7 H( y# c
  26.    gets(szMessage);
    - Y) T3 f6 ?0 @, p
  27.     // Create the socket, and attempt to connect to the server; D6 Z& _, J, l1 K/ t
  28.     sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    % {: D, V, U% U% o' o. @' s
  29.     if (sClient == INVALID_SOCKET)
    . I8 v1 ~9 \4 F' a, H
  30.     {. f! w  H9 p) [
  31.        printf("socket() failed: %d\n", WSAGetLastError());
    6 `, ^6 |! N) y+ E
  32.        return 1;
    $ e  \0 v$ J# u* I
  33.     }
    2 R  D5 S0 W1 K
  34.    server.sin_family = AF_INET;- Z7 V" ~! ?1 L) n4 _  R
  35.    server.sin_port = htons(iPort);
    3 z; U7 K; N" J1 ?9 I9 c% {
  36.    server.sin_addr.s_addr = inet_addr("127.0.0.1");1 R8 k) F  K  O7 f4 p5 u) U0 f+ X- o
  37. 0 |) ^% g8 D# ~2 l) s: Z  c7 r
  38.     if (connect(sClient, (struct sockaddr *)&server,
    ) g9 r- F- M) Q5 A3 U1 P
  39.        sizeof(server)) == SOCKET_ERROR)
    5 ]" l( K! R  f3 s+ Z/ a
  40.     {0 X  g7 o) D& i
  41.        printf("connect() failed: %d\n", WSAGetLastError());
    0 S( N4 ^" w& C5 z* x; K6 F
  42.        return 1;' v4 H1 r3 {" D- p6 |3 A5 L( h
  43.     }; f9 Z1 V: t+ i1 j; u
  44.     // Send and receive data
    1 b$ R3 [8 [5 h
  45.     ret = send(sClient, szMessage, strlen(szMessage), 0);
    + o0 V7 X% i1 l: V$ H! i1 n) H3 C( k; h
  46.     if (ret == SOCKET_ERROR)! n' o' q$ s. l4 K& H# ~# e
  47.     {
    2 }1 \# q# N/ Y/ s: e2 y
  48.        printf("send() failed: %d\n", WSAGetLastError());6 }/ d& K0 \+ f7 s$ C
  49.     }
    % e5 r+ b  p& F. q
  50.     else{
    ( b+ z+ _0 i: A. E/ k
  51.        printf("Send '%s' \n", szMessage);3 c1 O: r9 x+ ~2 K
  52.        ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
    ; k: o! e2 x$ h3 Y8 a. P; m: d/ }
  53.        if (ret == SOCKET_ERROR){
    ; g  E/ |3 _/ J" g% q7 |8 h- g8 f& Y
  54.          printf("recv() failed: %d\n", WSAGetLastError());
    1 S; a! Z8 A$ K% F
  55.        }8 Q( Q& s0 `/ _" I& q" \
  56.        else{
    5 K  o, |5 t6 W4 V, r
  57.          szBuffer[ret] = '\0';
    3 k6 `; k; ~5 [& G  ~/ |2 i
  58.          printf("RECV: '%s'\n",szBuffer);
    7 d( @3 }+ d8 K
  59.        }% Z  ^$ U" o+ ~8 B- g; \* L
  60.     }
    / `: q3 w  Q% q: L/ ]5 @
  61.    closesocket(sClient);% g3 f/ f' ?6 o8 D1 L
  62. 8 |: S( J7 t* o# a& m
  63.    WSACleanup();* m# o% g  h* \, b6 u
  64.     return 0;
    1 M3 \: f" x6 w! K
  65. }
复制代码
服务器程序:server.cpp# a0 Q  a  O! f3 m3 _- J3 f
  1. #include <winsock2.h>
    ) L5 C. S) d4 H/ N
  2. #include <stdio.h>& o2 J, A& o% V2 f' A. W5 r
  3. #include <stdlib.h>/ Q. |  P& o6 E& z
  4. ' W) X5 i5 ~; p  L  ?! H5 G
  5. #define DEFAULT_PORT       5150
    - i8 X* ^! \0 }' Y* }
  6. #define DEFAULT_BUFFER     40961 s9 L1 S8 \9 V
  7. 1 s7 T2 b$ q) X3 c. F5 o. D$ z
  8. int   iPort     = DEFAULT_PORT;8 j& L$ J) Y9 V) C* L+ o
  9. char   szAddress[128];7 x2 x' ]8 I: Q) v

  10. 0 y# V$ J3 P. ]( I. r1 W
  11. DWORD WINAPI ClientThread(LPVOID lpParam)
    + w- D, ^- Y, j1 h  G2 P0 i7 u
  12. {
    * L+ t4 n3 Y* S1 R$ s: G" n3 H
  13.    SOCKET       sock=(SOCKET)lpParam;$ I# N" o6 l$ K; J" U
  14.    char         szBuff[DEFAULT_BUFFER];
      ]9 P* E5 |5 I, U: G
  15.    int          ret;0 z: Q% c- B4 S( F9 M6 k/ p
  16. : d8 f: q, P! f5 ~0 d
  17.    while(1)
    , C( a7 |& ~* N/ q5 R; O+ k
  18.     {$ Y: R/ q" D* o% X
  19.        ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
    ' }! ]6 ]7 q- C8 z7 Z; F- i
  20.        if (ret == 0)
    ) `3 a1 i" g% B1 h4 I- A  r
  21.            break;
    - n" |9 j' g0 ~+ p
  22.        else if (ret == SOCKET_ERROR)) P2 p* s$ ?9 O' G( W1 x
  23.        {
    $ A4 B: `% J6 h% p/ \
  24.            printf("recv() failed: %d\n", WSAGetLastError());$ s2 I) `9 x! n) i: G! p/ p
  25.            break;3 C" o3 Q% i9 m- I3 N
  26.        }
    , f) |1 O! Q4 }" l: n
  27.        szBuff[ret] = '\0';* Q; r5 B$ n1 g8 O- b
  28.        printf("RECV: '%s'\n", szBuff);* W( C- |  B% y0 }7 j
  29.       if(strcmp(szBuff,"abc")==0){
    * q; X4 p: O9 _8 X  ]" p, h
  30.          memcpy(szBuff,"Send the correct string!",25);9 V( U) }* A4 ]
  31.        }' C4 y) F2 t4 n% X6 m# B$ j
  32.        else{. S# f6 B$ s  i& d
  33.          memcpy(szBuff,"Send the wrong string!",23);
    2 @+ r( t- L6 C1 C# {
  34.        }6 P+ E0 r* |: g4 R" F3 j6 S
  35.        ret = send(sock, szBuff, strlen(szBuff), 0);: R6 v; C. [# G
  36.        if (ret == SOCKET_ERROR){/ y9 Z+ n. L: X" e
  37.          printf("send() failed: %d\n", WSAGetLastError());+ ?% r- [* c/ x2 ~4 m8 }  A
  38.        }* t7 @7 W. t; {, g& G
  39.     }1 G) p! r' f! |0 W( j9 O
  40.     return 0;: ]# x6 e* E0 A9 O6 {- r' L! M
  41. }) w; H! n$ D' z. t# P. L8 g( ?! P
  42. 8 X& A5 x, I( n+ H+ T
  43. int main()- r9 I9 w% b) w3 |& C
  44. {
    4 E3 V  j( g. A* R5 _2 x7 X$ L1 O0 r  `
  45.    WSADATA      wsd;
    ( e' m& e5 _$ n* l+ i
  46.    SOCKET       sListen,) A6 n" u, t! Y6 {! ^9 }  N
  47.                  sClient;
    ' Y. z8 t7 f1 F0 p; Z6 U) o* ?7 H! n
  48.    int          iAddrSize;9 G! w/ T  ]- O2 N+ P1 h' ~" l
  49.    HANDLE       hThread;, N; W3 `+ O$ k
  50.    DWORD        dwThreadId;1 l8 _* F/ ^3 Z: x
  51.     struct sockaddr_in local,6 b4 t& W9 T, f5 z) q$ R/ h
  52.                       client;  D2 V9 M8 X( b  n+ C' {2 V* }- J# m

  53. 4 j* n0 x' @  a" k
  54.     if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
    ( L% Q" {% S; P" N- ^. }# `9 D; z
  55.     {
    . r( l8 J/ ~# l
  56.        printf("Failed to load Winsock!\n");# w8 d5 R$ e! ?  S/ ~7 t
  57.        return 1;; i& w8 @: l% Y! D
  58.     }& X; C4 t1 w2 v+ w0 z8 ?# N
  59.     // Create our listening socket
    / w! p! R( G, Q9 W0 ]) g9 T
  60.     sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    0 u1 ^3 \/ K2 s6 g! L% [
  61.     if (sListen == SOCKET_ERROR)
    ! q- s* J# I' h9 g: P
  62.     {
    , y3 ^0 m3 I. c! |8 ?# l2 C: }
  63.        printf("socket() failed: %d\n", WSAGetLastError());+ k! \2 x/ I- ]( X- I
  64.        return 1;2 \7 C# e; G) y2 R5 C  H
  65.     }
    % s3 H: W3 g  n) u* f+ a* Y
  66.    local.sin_addr.s_addr = htonl(INADDR_ANY);- N7 v: ?" z8 ~( Z5 J3 b
  67.    local.sin_family = AF_INET;
    ' |, U! {( N+ h. U$ z' [. r
  68.    local.sin_port = htons(iPort);
    $ b8 B5 p5 l4 g6 Y5 Q
  69. / f/ k( _# N5 E+ I9 @6 p9 i; s& n
  70.     if (bind(sListen, (struct sockaddr *)&local,  s8 c- H6 ]& q( ?5 {6 A2 t
  71.            sizeof(local)) == SOCKET_ERROR)* N2 p* V- c, c! e. m7 h. d: s7 c7 q
  72.     {
    . @5 B4 E2 t( G5 P2 u
  73.        printf("bind() failed: %d\n", WSAGetLastError());: d( [3 v9 I4 c, F6 i2 e
  74.        return 1;- y" w. o! h7 \' D8 p% I5 }( c
  75.     }6 z' ~3 D/ @! _" a
  76.    listen(sListen, 8);/ K5 w7 i! x3 w' H3 Z0 Y- g9 Y
  77.     // In a continous loop, wait for incoming clients. Once one
    $ ~/ [) n7 e# k1 I0 _
  78.     // is detected, create a thread and pass the handle off to it.! U: ~2 w& ]' _
  79.     while (1)% l8 P+ T) `/ O5 Y7 V
  80.     {+ c2 i/ d6 W! B$ t2 P) l
  81.        iAddrSize = sizeof(client);& C( @% ^0 R( C9 i1 T9 z3 {
  82.        sClient = accept(sListen, (struct sockaddr *)&client,% I# ]+ v# |5 G) S  g4 F9 J2 _: T
  83.                        &iAddrSize);      
    4 G! P2 w9 t+ b
  84.        if (sClient == INVALID_SOCKET)
    2 Q- _* L% Z$ m7 k# G* r1 Z4 _
  85.        {      
    + }5 o% O; F& T; ^
  86.            printf("accept() failed: %d\n", WSAGetLastError());
    2 U8 Z5 a8 [0 N4 |0 N! {$ ]( B
  87.            break;& N0 A9 e) a! z# g. D, D* X
  88.        }0 |0 g+ [* }6 b- o7 P& c7 ^/ ?5 n: @
  89.        printf("Accepted client: %s:%d\n",3 r* z  o5 ^$ Z8 u( O4 N) v3 j
  90.            inet_ntoa(client.sin_addr), ntohs(client.sin_port));
    , b+ j0 Z5 L7 l3 I0 L3 o8 f4 x# f

  91. 6 ?; P! m+ o0 Z: ^. C
  92.        hThread = CreateThread(NULL, 0, ClientThread,# L+ @' v. L/ a6 `# u: |
  93.                    (LPVOID)sClient, 0, &dwThreadId);6 M, x5 j1 a- J5 A, i5 x
  94.        if (hThread == NULL)9 w( x4 v+ R6 O/ M1 {, Y2 C
  95.        {2 `5 N% Y7 n  m* O8 h
  96.            printf("CreateThread() failed: %d\n", GetLastError());
    1 h0 u5 N! n3 b& V, U
  97.            break;
    4 z- n% |0 ^. I% l
  98.        }
    . h; b4 ^( J2 v' X  a
  99.        CloseHandle(hThread);
      m- X0 g$ Z+ j8 _4 z8 U
  100.     }, Q; t; v/ p2 L' d
  101.    closesocket(sListen);3 |# O5 h% @  l+ B
  102.    
    0 F  o- p' v2 `6 _1 N. s& u
  103.    WSACleanup();
    ( ^. x' b/ d0 A( W
  104.     return 0;5 O, S- ]/ h9 ~+ k# `3 ?6 _5 e5 c
  105. }
复制代码
9 F- g  m/ a+ I4 X) k0 O7 X' d. o
' d7 t. f6 v- R! B
( ^8 _) z# Z  v9 m" t

0 E. ?4 s0 X8 {4 O7 ]8 ~* Q, T; x' {, q% D) `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:16:45 | 只看该作者
  1. 作为服务器,你要绑定【bind】到本地的IP地址上进行监听【listen】,但是你的机器上可能有多块网卡,也就有多个IP地址,这时候你要选择绑定在哪个IP上面,如果指定为INADDR_ANY,那么系统将绑定默认的网卡【即IP地址】。
    / O0 K) z! j7 I4 |* i

  2. $ x6 T8 Q3 R, `' \
  3. 作为客户端,你要连接【connect】到远端的服务器,也是要指定远端服务器的(ip, port)对。2 F7 [+ z' |+ Y( k- Z) [1 r" G. O
  4. 当然,在这种情况下,不可能将IP地址指定为INADDR_ANY,系统会疯掉的。
    + n6 G; e; Q# T3 ?+ y3 Z

  5. " h: s2 G7 {: D& i; @! w
  6. Server:
    ' M& G* t7 \! ~: g( h3 e& R
  7. #include <winsock2.h>9 Z3 U: _$ P# S0 g+ P
  8. #pragma comment(lib, "WS2_32.lib")! M: F) g: ~. {# C4 l/ m1 J- _4 X
  9. * g9 Z% |: X! {7 {  h% i7 U/ n
  10. #include <stdio.h>! `# o% {: l: u
  11. void main()
    " d$ Q5 K. ]! H, W/ S7 B) I
  12. {2 P% U1 w( C3 p, n2 T) E- p
  13.     WORD wVersionRequested;//版本号
    . M/ U: A% i# _. U! Y
  14.     WSADATA wsaData;7 H# E+ ~3 }# i! r+ d3 H
  15.     int err;# b! V! g4 ]  t  j4 T4 T; P& G- y
  16. ) }  N* b& ^( g0 \
  17.     wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字+ ]% w; s! N" U( f
  18.     //加载套接字库,如果失败返回0 ?+ g4 f9 c! W
  19.     err = WSAStartup(wVersionRequested, &wsaData);
    6 [* o1 ?- z' j& E  V! ^
  20.     if (err != 0)
    0 U/ ]9 l! T* O' I. L
  21.     {
    5 e- R$ y3 C/ I9 o3 |) z% s
  22.         return;2 J1 A4 U7 _9 ?
  23.     }' I" a1 Q4 W( W2 F/ q; W. Q; g/ M

  24. * e6 d5 \0 t$ }  f+ ?2 P
  25.     //判断高低字节是不是2,如果不是2.2的版本则退出
    ; g/ Y4 J% p1 n' Z0 D/ i* M: r
  26.     if (LOBYTE(wsaData.wVersion) != 2 ||
    ) f. O! q( _5 B  ~0 b
  27.          
    * F5 e8 @# m- [& X1 D
  28.         HIBYTE(wsaData.wVersion) != 2)% p6 w- n* q$ w4 D; r4 T
  29.          # }  K  F- n, V8 d& S0 g
  30.     {& c0 Q, a; X4 h( z' T& C
  31.         return;" v4 \& M4 E, V* `9 U# u4 g+ t2 p
  32.     }8 N( r7 [+ B% I: \% Q' I, X
  33.      
      ^2 R' @) L' k: h! {  k
  34.          //创建流式套接字,基于TCP(SOCK_STREAM)/ a' I( X4 c7 s, j9 c1 o0 E

  35. / F' n4 l; V7 ~$ i( L2 d
  36.          SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
    3 ^$ ^! V' X8 i8 P5 d1 h6 J$ ?$ B

  37. 2 B# ]/ x0 ^, @7 C' I2 @
  38.          //Socket地址结构体的创建
    6 o$ u9 v  l* H0 {4 _2 m
  39. ! w# a: N8 k! `# o
  40.          SOCKADDR_IN addrSrv;5 ^' R$ ~. S! z$ v$ w/ N
  41. ; i5 e+ q0 v' ^
  42.          addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格  O5 t$ `5 I$ d
  43.          addrSrv.sin_family = AF_INET;//指定地址簇& q$ P# }, ^/ l' y$ \0 q
  44.          addrSrv.sin_port = htons(6000);1 N9 y$ ?# Z0 u, L
  45.         //指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
    - }' I5 A9 W% X+ u

  46. : Y9 g3 q: t1 d! o5 O' j
  47.          //将套接字绑定到一个端口号和本地地址上
    4 x; }& V# N1 U# J/ E
  48.          bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行5 C& G7 V. b: b( T( z
  49. % I0 n$ }. s! @: K! g
  50.          listen(socSrv, 5);
    + q* h& S1 A7 Z6 G, O
  51.          . {# l$ R$ R2 k. G/ O- ~9 X5 k( G) {
  52.          SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体
    . i5 j% |$ O7 q/ s5 ]4 x+ y; O
  53. 8 _" j, f; `9 T9 i, ]8 q4 {: U' A' ^
  54.          int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof7 G- s. \" V- d$ E! r4 S; u

  55. & P2 F2 w3 u0 G/ d8 U
  56.          //循环等待接受客户端发送请求9 b9 p6 Q" z: d& x2 x" |& ?

  57. $ D; ~/ C8 d- A! |+ d: i
  58.          while (1)
    : f# R8 h" h$ ]6 P
  59.          {; `* X/ [2 n& P& o& y( F, V
  60.                    //等待客户请求到来;当请求到来后,接受连接请求,9 d2 h2 u! c, L! m, w, z0 X
  61. . J2 M" w# h+ @% u% i* E, U
  62.                    //返回一个新的对应于此次连接的套接字(accept)。" f0 h! F+ U. N" ~; [" T% L
  63.                    //此时程序在此发生阻塞7 J3 W+ [  c) r; o& ~* A
  64. 4 B2 C# i2 w; F
  65.                    SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
    & C- W( |2 e! u9 n% j) ]2 S* H& U3 Z
  66.   J( j5 q5 v8 Y2 T
  67.                    char sendBuf[100];) b# h# i; }. q! d) R' M

  68. 7 ]8 T$ C7 R: N4 z  f& r  b
  69.                    sprintf(sendBuf, "Welcome %s to JoyChou",
    5 X5 ]+ P# t; z' I' T
  70. 6 ]1 f4 Y2 s3 K6 h# d/ `
  71.                             inet_ntoa(addrClient.sin_addr));//格式化输出
    $ B5 b4 ?6 j& p6 q/ D, L$ |8 ^

  72. ( x: T# T& ?1 q) M& R
  73.                    //用返回的套接字和客户端进行通信& U$ n: S5 o7 K* L, n

  74.   C& g5 l; [# R( M7 i
  75.                    send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节
    $ h# E  r+ W/ l+ i
  76. + \1 g* e1 b) _( N  \* Y
  77.                    //接收数据. [8 b2 }8 |0 k+ ^% q0 ^
  78. ( v% `/ ]" \) \4 W: q
  79.                    char recvBuf[100];
    3 B2 J1 u; ~) L4 ?

  80. 4 P* h. Y5 H4 m
  81.                    recv(sockConn, recvBuf, 100, 0);9 V5 k8 [) x) M& f9 e* j

  82. . O3 Z. R! y, P, I
  83.                    printf("%s\n", recvBuf);" v7 [  N8 L$ X% f5 F0 B
  84.                    closesocket(sockConn);
    0 v# c: X$ A9 y

  85. / s6 U: ~7 E; h$ q: h
  86.          }
    1 s& V8 }5 i! p$ \$ N2 j
  87. }5 N$ Y  q8 Y/ ^5 X* i# U

  88. 0 `1 P3 s/ k) K: W9 p  A/ l
  89. / ~+ F* i# i& D  r: a/ @
  90. Client:$ W2 l9 @2 _) i6 ]' x& W' [9 }; k

  91. 7 I& T* J* Q7 `6 P. O) H7 c
  92. #include <winsock2.H>
    3 |+ f5 I. }- {4 Z, T
  93. #pragma comment(lib, "Ws2_32.lib"), B% ^( J3 m7 v! p' g; r7 [- I2 I
  94. #include <stdio.h>6 G3 q" `! {, V/ E/ b$ {6 b
  95. #include <string.h>; n4 J, d& z2 L& P- E$ z: e

  96. / S3 S4 ?2 G+ g& ]! X
  97. void main()
    : O& k+ e, A/ _6 C. t) ?/ J
  98. {   ( u. D( C$ x" ]
  99.     WORD wVersionRequested;; G' g( Z& X) @: o
  100.     WSADATA wsaData;
    + Z5 t. n2 H2 k& Q. j: u
  101.     int err;
    & I4 ?+ Y) d/ w7 f1 o. K
  102.      ) f# L5 }, c4 W! M4 c
  103.     wVersionRequested = MAKEWORD( 2, 2 );
    " Y  o( f& ^: Y5 z8 [
  104.      / a' Q& Q0 l* K% G! C
  105.     err = WSAStartup( wVersionRequested, &wsaData );
    . c. ^; j8 F8 F% n: O: u2 c
  106.     if ( err != 0 ) {
    5 n- T% C3 J7 R& |, ~5 w
  107.          # Q7 R( @9 A7 ~/ v! F
  108.         return;$ l; |0 q% u# J, Y3 Q' N3 W& c% a
  109.     }
    5 V% t5 v! h% E, F4 I5 I. \) @
  110.      
    ! I4 {# o, d) A0 v; u& i
  111.      
    $ V- I, @8 B+ B
  112.     if ( LOBYTE( wsaData.wVersion ) != 2 ||$ J) [  f7 s% }# n5 M- R. @
  113.         HIBYTE( wsaData.wVersion ) != 2 )
    6 t" a0 Z) z) a0 _9 J+ U* U2 N
  114.     {8 b2 t+ G3 D  i) r, J" ?  G
  115.          
    # y; E- G* K9 Z2 G% `
  116.         WSACleanup( );: d& U/ S/ g8 ?; ^
  117.         return;
    & V3 }7 h$ I. o$ n$ }8 `! ~) b6 m# m
  118.     }! z5 E1 X: L8 F0 _# H$ D
  119.     SOCKET socketClient = socket(AF_INET, SOCK_STREAM, 0);
    # ^4 \4 o1 }8 m; |0 G+ d
  120.     SOCKADDR_IN addrSrv;
    ; `6 z& c5 s; k; S2 G
  121.     addrSrv.sin_family = AF_INET;% U, C7 `% e" j4 U7 C
  122.     addrSrv.sin_port = htons(6000);
    6 F: O6 y9 j5 c% j! v" J& i
  123.     addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.1.101");//服务器端的IP地址
    9 n0 l$ w# R% H, f6 D* q7 w
  124.      - [9 V$ j2 ]: [: J
  125.     connect(socketClient, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
    4 A% H5 p: k+ _- P7 f
  126.     char recvBuf[256];4 y5 S7 G! `* q/ H: m
  127.     char sendBuf[] = "This is Joychou";
    ' L! n7 s  A6 b. y+ K* w2 i
  128.     recv(socketClient, recvBuf, 256, 0);. k' |* H: L# \* x
  129.     printf("%s\n", recvBuf);
    2 C4 `  ^9 y% M/ l! G  s
  130.     send(socketClient, sendBuf, strlen(sendBuf) + 1, 0);! H4 a0 Q- d& s! L
  131.     closesocket(socketClient);  ?8 `8 X8 \& W2 `" r7 _. v" i! X. M
  132.     WSACleanup();
    5 r0 |4 A) A' k) k7 S8 W
  133.      9 O# K' M0 s: z7 t# X
  134. }
复制代码

6 |, x0 a% y2 ^6 G& l6 Q6 `5 X& l, X6 l* b& \
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:31 , Processed in 0.073427 second(s), 18 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!