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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
- B+ ^3 d/ L+ Y1 S+ _" j我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。- j8 S' U& F1 l; C( b3 d6 `
Talk is cheak , show me the code.6 P6 P" W- x: p' Y2 X8 w8 Z
服务端代码:
) J/ K4 K$ g: q7 S
  1. #include<stdlib.h>
      M: @/ V* L2 E0 o  |! ?% N+ j. p/ \
  2. #include<WinSock2.h>
    ( A- a5 q7 C& e9 X, m: p3 w: |
  3. #pragma comment(lib,"ws2_32.lib")3 c% n' h1 V6 \3 n0 Z" A3 N
  4. int main(){
    , f, k% R% R- e" N3 u
  5.     WSADATA wsd;
    " A; K  v) @0 @+ B8 A* g
  6.     SOCKET sockServer;8 c8 j) J8 q2 j4 J& \
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号3 i: C. i/ l& }: q6 o% M
  8.     SOCKET sockClient;  l7 v1 h0 M, w9 V! w0 Q# z
  9.     SOCKADDR_IN clientaddr;
    8 n4 D, E9 M7 C
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口. }) Q6 v" l. L( C7 p
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket; ^$ l5 m3 W) |/ N6 T- b
  12. . e/ |2 ?) h1 u. S
  13. 6 ?, e4 ]. h7 p3 T. \& O& z
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){+ `/ r2 ~& j$ }* E2 M! Q3 I
  15.         printf("Socket has been created :%d", sockServer);0 H5 j. I# D& G, Q1 N! C, d% b
  16.     }7 x. `7 K+ ?4 N: h  K8 l# S
  17.     else{
    - N7 U7 g3 |7 l# T* e# h; U
  18.         printf("Socket create failed.");5 P# a1 N+ u8 h; ?( v9 n9 `" i- _3 S
  19.         exit(0);. J/ s" s! i3 U7 s* e1 S! \2 \
  20.     }
    7 w9 X% J& |" i: J
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);4 O1 ]5 e( g9 G2 {8 e6 M- l
  22.     serveraddr.sin_family = AF_INET;
    6 [. O6 e- R+ R
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    6 p6 _! G- k# a6 q/ Y, P2 r/ u
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));3 ~0 i3 Z& Z* S/ f! d1 V  r
  25.     char recvBuf[100];5 A' _! R  ~1 p! k8 L7 m  Q8 l# H
  26.     int len = sizeof(SOCKADDR);
    5 I7 `0 ?5 ~( A% y5 U5 K/ ]  b
  27.     listen(sockServer, 5);//5为等待连接数
    . L8 T  x2 n# o) K- B! Q
  28.     while (1){
    ! g) w# x  _2 ~  L( ]
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    $ F: t+ {* h7 b$ _4 V
  30.         //接收客户端数据
    8 R/ v4 p$ i* G, u$ h/ y
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);  o( C) ^: S% W* r$ S
  32.         printf("to me:%s\n",recvBuf);
    6 z7 Y$ b* U& u2 m7 @6 F% B
  33.         memset(recvBuf, 0, 100);$ L/ b) q0 {" j7 u2 R7 Y4 n8 t
  34.     }, g6 {. C! A5 |( z; `9 i5 V& O
  35.     closesocket(sockClient);
    ! b' ]$ ^& J) ]4 x( J+ w
  36.     system("pause");# o$ a0 ~5 L" U! H& ~6 w! j1 }
  37.     return 0;1 q$ w/ _. E; M1 y( p" c, G6 }/ y1 g
  38. }
复制代码
客户端代码:9 Q( N  a# X* T: \. i2 ?
  1. #include<winsock2.h>$ q' N. p3 S+ S( z% _
  2. #include<stdio.h>
      E) |  `6 A# ^6 j3 V2 w. a
  3. #pragma comment(lib, "ws2_32.lib"). u# m7 W1 @6 D0 k
  4. void main()
    8 m$ C' B; |+ s; q& U  ?% C, X3 f$ q
  5. {8 r( L/ ~1 P1 b+ c! X) S& Y. B  B, H
  6.     WSADATA wsaData;9 X% a$ S# ^; X% C( q) M3 S! \
  7.     SOCKET sockClient;//客户端Socket
    ' W3 E7 z; V1 w- ]- }
  8.     SOCKADDR_IN addrServer;//服务端地址# ~, c, g7 C8 i7 p- [4 R1 x1 D& W
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    # I& Z- ~7 ^  i! I- H3 p1 e  _
  10.     char message[20] = "HelloSocket!";
    2 ^& \, i- l( U& M  O5 }3 w
  11.     //定义要连接的服务端地址
    " Q7 `3 k8 W2 d  `5 t/ s
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    8 L5 z2 j6 c: O# u- y- L
  13.     addrServer.sin_family = AF_INET;. r5 X3 ]0 v; b. x& E0 H
  14.     addrServer.sin_port = htons(6000);//连接端口6000  T1 c- P+ \" h0 |1 t) x
  15.     //新建客户端socket4 l3 P/ I( K0 V3 m0 {+ e* r( j
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    . y' k! K* z. j0 r$ J% c, b6 r" R0 n2 |
  17.     int s = 0;* F! v: A) e/ Y6 P8 b8 h& M
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    : H% n4 P/ s: _( V, s' z% H- @/ {

  19. # ?% e% d4 {; a! q6 _
  20.     while (1){
    8 K. K/ [% G4 s# S
  21.         //发送数据
    % l% |% [6 H  {1 [  G/ F
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);  ~# x( A% ?" U+ j5 z9 e# z# G
  23.         printf("to server:");( R) w& [  [% t8 p/ ]5 I
  24.         scanf("%s", message);
    1 c; k& N& h, m. O5 J5 r

  25. / {' |% y$ E7 Z" t( e: u
  26.     }
    - A5 e4 s( _: }
  27.     //关闭socket7 x2 y, R* Y9 n1 B. h
  28.     closesocket(sockClient);
    : n. L( ]) s' {' z$ }' Q6 _& ?2 s
  29.     WSACleanup();( u+ }2 y5 _, m+ _7 P5 y
  30. }
复制代码
求懂的高手来解答一下。
& M& `/ @" [/ _; v  |4 C5 O谢谢了!% o6 _  ^! |: {7 ^, H
+ d% ?/ G: ~: ~

8 Z, O8 t2 ~/ T4 }1 a5 \9 x) e4 u% `" i2 [2 ?+ U. a7 H: _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为' D- o, D6 R8 H. @
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-5 01:12 , Processed in 0.055534 second(s), 19 queries .

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