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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10541|回复: 2
打印 上一主题 下一主题

[C] C语言 socket 编写简单服务端客户端通信问题

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。" n. ]" A0 M/ {: I8 S2 H
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。/ D, B7 O0 k2 g9 d* P* m9 `$ R5 C* N' j
Talk is cheak , show me the code.6 P. m, f- B' V) S. l  v
服务端代码:
: Q' o3 _) l; h+ X( A' C" i
  1. #include<stdlib.h>. {5 c4 @( _& u6 \7 ?  G2 L- l9 {$ d
  2. #include<WinSock2.h>
    . R" F7 B. G# u( m
  3. #pragma comment(lib,"ws2_32.lib")
    + `0 e5 p. |! x9 }6 l0 n
  4. int main(){% Q+ l1 y$ k+ v
  5.     WSADATA wsd;
    8 ~6 m4 {0 T0 z. S9 q
  6.     SOCKET sockServer;5 k9 G4 ?$ A$ A( A
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    * d+ U# J2 s' g* R* c
  8.     SOCKET sockClient;
    - B$ \' L! x) f3 Q5 o' L& l
  9.     SOCKADDR_IN clientaddr;
    . Q- c. H8 S) h7 O0 y
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口/ i. e0 ~* U4 H- B: ?/ d: k
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    / e- R. ^* n1 R: u7 S. R3 E8 e* M
  12. # r: h) _- I0 V& }3 \! P

  13. : v8 S" t, g) Y( m5 O
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
      q: C/ D% l% }+ m
  15.         printf("Socket has been created :%d", sockServer);# ^5 \$ i" X3 w. O7 O' |6 c
  16.     }+ d  `/ `0 O& _( |+ A; ]
  17.     else{
    ' [% A8 i  {. k- z0 F" ]/ l
  18.         printf("Socket create failed.");
      v, v5 \/ ^$ _& b% u
  19.         exit(0);
    5 z: |. A, v# N* q9 C6 S8 @% c/ O
  20.     }
    0 ?: O. w  g" Y
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);. ?- q4 @( n4 E: K  s" X6 T# l
  22.     serveraddr.sin_family = AF_INET;# u/ W7 x% {, n% n
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ) ^, T& }! Y5 l1 P
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));/ I' f/ b5 X# z. Q
  25.     char recvBuf[100];
    % `& v! t. Z4 U# D! a
  26.     int len = sizeof(SOCKADDR);) `4 M' f. C! @# d2 Z6 O, v1 M
  27.     listen(sockServer, 5);//5为等待连接数1 }! p9 X) y& h' z
  28.     while (1){
    , ?$ t  ~& M6 M5 Q
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    , s4 x4 P- g, N* |
  30.         //接收客户端数据! b5 k1 X% }; S% E0 i
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    - n% f' `) z" ?9 A% ~$ h1 ^4 t2 Q
  32.         printf("to me:%s\n",recvBuf);7 `- L  O: _1 J- C, p
  33.         memset(recvBuf, 0, 100);$ v( z9 J9 I; ]0 f
  34.     }. E7 s1 T: w# A) z5 p8 {8 ~. c
  35.     closesocket(sockClient);
    : \  R8 C" Z! k$ O
  36.     system("pause");
    & @9 I, ^" h% @9 L, ?" D
  37.     return 0;
    4 t; G8 ^) F* r7 ~5 k2 I0 Y1 F
  38. }
复制代码
客户端代码:, n' d* z4 j: C
  1. #include<winsock2.h>
    7 z4 n* {# o0 v6 c- I$ k. o
  2. #include<stdio.h>( `+ U- f) P. d8 q
  3. #pragma comment(lib, "ws2_32.lib")
    , n+ H* K$ C) n" B/ g9 P
  4. void main()4 q: E5 `8 \3 \. G/ J' t
  5. {
    + q7 J2 [/ I' V* G  G7 N  \- ?( b
  6.     WSADATA wsaData;( U1 L- J8 u( |7 f" N  {5 G+ b1 v+ F
  7.     SOCKET sockClient;//客户端Socket
    , }1 T  L5 ^: a
  8.     SOCKADDR_IN addrServer;//服务端地址2 u. e1 B) z6 F7 W' |
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    $ }+ T) C8 C  Y- v5 y( w- J. I
  10.     char message[20] = "HelloSocket!";
    8 t# L5 S* g# n6 {5 O5 L
  11.     //定义要连接的服务端地址
    " b  d, o) S( B* e3 }
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)# i; X! D% ]9 f& K
  13.     addrServer.sin_family = AF_INET;
    8 a$ O9 }& U! I/ m! G/ j; U
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    % P7 N4 `& ]2 n% H3 X
  15.     //新建客户端socket0 a5 c! v/ g1 Y2 {
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);3 l8 A1 r* X6 k; g
  17.     int s = 0;4 @2 ^- J' i1 i2 x1 |
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    0 t+ n. F$ N6 W2 g
  19. 3 |4 o" u+ z/ |
  20.     while (1){
    . g1 a, i. N' I) A8 G
  21.         //发送数据( I3 z/ G1 F: @
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    " x8 b; j0 u( P3 F& i% o# \3 ?; Y0 N
  23.         printf("to server:");
    8 V6 @/ ]) ]- G% M3 E2 l& i/ ~9 I
  24.         scanf("%s", message);
    ' b3 }- |% d) u, F( [$ }

  25. . s& V8 u  e0 I7 m  U/ ~
  26.     }
    9 x* K; h6 U8 {# J
  27.     //关闭socket
    2 s: x, ^8 H; O, x% A
  28.     closesocket(sockClient);2 y3 ?1 ]% P' a- H" G; v* S0 D* l
  29.     WSACleanup();( v8 ~3 v" {$ X& P5 d  M+ x5 Q
  30. }
复制代码
求懂的高手来解答一下。( k: a5 M. F% k# C1 ?
谢谢了!
. ]7 x- t. v3 j7 o1 z

7 [4 b. j; x3 _* Z
* M; Q- o2 ^; i  K
* S: a1 n! n8 `% E4 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为; r3 |2 H( w/ ^6 P
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-19 05:34 , Processed in 0.129426 second(s), 20 queries .

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