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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。
" z  x. b/ W* M% v( |4 {我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。* l$ j$ ?) f* f& d
Talk is cheak , show me the code.
  J; J& x& Z: M2 \8 M1 \# T4 b服务端代码:$ \* u4 ~3 B' o" W) h/ \
  1. #include<stdlib.h>
    0 p6 ~2 ^! \; ?+ ]0 \7 {& b
  2. #include<WinSock2.h>
    0 I1 x2 m- m8 |0 d& o0 K
  3. #pragma comment(lib,"ws2_32.lib")  X4 Z1 D2 X2 E2 p
  4. int main(){# j7 @: K% J6 g* |
  5.     WSADATA wsd;1 b3 }% \; M) w0 D, W. |9 S$ p
  6.     SOCKET sockServer;% }) \7 |6 b7 _0 h; ?9 Q) f
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号5 y; Y$ Y4 d0 X  s; V) t: U
  8.     SOCKET sockClient;
    ) Q: ?8 D; f4 j9 m$ Z5 B& d8 P' }
  9.     SOCKADDR_IN clientaddr;! h4 u- v$ j1 E' j! V
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    , p, f/ R+ ^: W$ f: L) j% h
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 g) p% ]# _8 y, }: ~8 n8 U! H

  12. 8 k4 q( Q2 j" Y9 N' M

  13. + D: Z  Y% j) `4 t3 h
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ! K9 ^& K, J  N
  15.         printf("Socket has been created :%d", sockServer);/ E3 v" O8 @, k7 Z; X
  16.     }1 d# t" r: }; V( Y2 {
  17.     else{3 K) y2 q- w3 C" b" m" k
  18.         printf("Socket create failed.");) h8 O& L8 P6 }( r* J0 _7 Q7 [# ]
  19.         exit(0);
    + b) @5 X, F% d, g
  20.     }
    9 o9 @4 _) |: O2 |9 n
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);9 X7 g, p4 n; m, _+ `8 U
  22.     serveraddr.sin_family = AF_INET;
    $ w2 c7 ^- v' l" T  N" P
  23.     serveraddr.sin_port = htons(6000);//绑定端口60009 I/ Y* v8 Q; n- o6 H3 g  Z
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    % q, |9 G' F2 W$ D1 Z( @
  25.     char recvBuf[100];
    ! |5 r5 d9 i* C8 H# ?5 C
  26.     int len = sizeof(SOCKADDR);/ x' b, H! R8 E
  27.     listen(sockServer, 5);//5为等待连接数2 t1 |( ^1 s- C$ i6 S, m' J2 p+ p$ I7 q
  28.     while (1){
    4 @( ^% m* J1 I% Z8 e( X% s
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);0 t. @% y$ z, ?7 {8 s, @
  30.         //接收客户端数据
    8 C4 M% u+ g& V- T. K7 v- K
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);7 u, N. E7 N# Q3 F7 R
  32.         printf("to me:%s\n",recvBuf);) L( ^7 R  Z  x9 o& {
  33.         memset(recvBuf, 0, 100);
    2 E( f% U; `* b( e+ G; o" o: D; w
  34.     }  G  S0 a) c" H3 `, @- b
  35.     closesocket(sockClient);7 j7 r6 G& a; n8 g
  36.     system("pause");; [! _8 A  L$ c
  37.     return 0;/ Z0 z9 Z/ l2 B+ }- u+ `5 ]% b+ Z1 G2 d
  38. }
复制代码
客户端代码:* j0 U) x( ^( u+ i1 j& }) n7 G; v' ?
  1. #include<winsock2.h>- C& G; p1 k7 m4 X! L0 d
  2. #include<stdio.h>
    1 C) }% Q7 M: B# L. q( L
  3. #pragma comment(lib, "ws2_32.lib")" L' q3 U5 y! \0 t: y$ g6 y3 G" |
  4. void main()
    ' r, Y3 w9 x  K8 s
  5. {3 l& v2 J1 Q) N% n% ~) P
  6.     WSADATA wsaData;/ x5 @2 H9 u5 @, e  }
  7.     SOCKET sockClient;//客户端Socket
    % Y, y  X+ r: S% H+ B
  8.     SOCKADDR_IN addrServer;//服务端地址! @5 Y2 l3 {+ l% k" f4 z
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) l# e0 w6 y+ Q/ }
  10.     char message[20] = "HelloSocket!";
    ) ^/ z9 o/ N9 F. c) j, A9 s) Q
  11.     //定义要连接的服务端地址$ {' \, [  y4 X( o
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    . |4 c' h- h& y1 {: g9 P2 v
  13.     addrServer.sin_family = AF_INET;. ~$ R0 D  r9 A* A
  14.     addrServer.sin_port = htons(6000);//连接端口6000+ n4 ~' k3 k2 m/ V
  15.     //新建客户端socket
    + B% O- R+ n- c- Q+ ^
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);3 _8 f( g0 D5 `3 D0 S
  17.     int s = 0;
    3 Z9 M$ k; a$ l4 s
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));9 u6 Q% M- O% I6 h

  19. # @0 }; n# h9 }
  20.     while (1){, a; T( L; E0 `2 g) c4 a
  21.         //发送数据5 W+ l( n' \, B
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    3 w, K8 J5 N" V' m4 e$ U
  23.         printf("to server:");# [  [" u+ O1 J1 R
  24.         scanf("%s", message);8 e1 H1 X& c7 i

  25. - E% y* \" s( f3 b% P+ \
  26.     }
    - q7 `) M& i+ k  t
  27.     //关闭socket: F. m" j$ D( h( L0 H
  28.     closesocket(sockClient);
    5 L# T  [/ I+ V% I! [
  29.     WSACleanup();' w7 m  [9 J. g1 p( n9 k# \  v2 y% S
  30. }
复制代码
求懂的高手来解答一下。
, }' U- v+ V0 p% k8 W谢谢了!  b. W. T' p, H& ]

0 L( _; }  s: e& ?3 g5 C4 A" c+ Y0 Q9 h8 G2 c5 H. }9 S) C* V) z

0 l, v/ \1 [: {( d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为; j' L( L& D! Q2 k  V; ~0 z5 }
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-19 01:35 , Processed in 0.106773 second(s), 19 queries .

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