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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
5 g" m& o" B. W  N8 x0 B6 I8 f我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。9 a& ^/ r& y9 o8 a2 ?% ?
Talk is cheak , show me the code.2 p8 \# W) U- s
服务端代码:' s  d% s$ r* M+ b/ R
  1. #include<stdlib.h>
    4 p$ v( R! v: y3 h% [* F! j! l  L
  2. #include<WinSock2.h>& u4 W8 x! |; o" @# E* Y2 b, ]
  3. #pragma comment(lib,"ws2_32.lib"), C9 O. ?  H* G+ ^6 Q, e
  4. int main(){
    " b4 Y6 h0 p) z- {% B+ d
  5.     WSADATA wsd;" S8 @4 y) Q$ ~- O+ G& r9 ~2 c
  6.     SOCKET sockServer;
    1 X  @6 R1 {# R- }. w8 x3 h! S
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    2 t6 x2 t5 \7 H# z
  8.     SOCKET sockClient;
    - y1 j; H7 Z1 U3 i
  9.     SOCKADDR_IN clientaddr;; |5 k. `$ k% n2 U5 m- {
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ) @9 c0 Z/ @3 m1 b' k# T. ~& M
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    - S! h, G, K9 @6 y4 f# E
  12. - \2 v0 C- R# o9 h# z5 C

  13.   m7 H: z( n2 g0 D
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){; e: S0 _& J) N; |
  15.         printf("Socket has been created :%d", sockServer);5 \6 T* b+ `3 q6 T+ N6 V; O3 k; L
  16.     }/ V9 I7 m# @, j1 Q
  17.     else{+ ?( y1 }2 k  W5 C3 X* O8 g3 A
  18.         printf("Socket create failed.");9 O& `- @/ m2 g5 U) f
  19.         exit(0);
    . E) J$ U! l( X9 h0 i. d
  20.     }
    9 x" s( v$ e* r# Q- L$ Z; {! ]
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    " s0 a; h* a7 U; j
  22.     serveraddr.sin_family = AF_INET;# T% v# ]# c4 b4 [. ~. r6 i
  23.     serveraddr.sin_port = htons(6000);//绑定端口60000 X+ Q3 y, r( H, e2 R0 k
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    # E" W. T* q# ~2 K
  25.     char recvBuf[100];
    ! O' \! S, ~) U5 @
  26.     int len = sizeof(SOCKADDR);+ d! H) S7 `- E4 I
  27.     listen(sockServer, 5);//5为等待连接数
    9 p' }. U" Q" x
  28.     while (1){4 p" ?& z' ?3 y$ }" R3 F* g  R4 I2 i
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ! _  O  X) K# n9 F8 |4 |, y% J
  30.         //接收客户端数据
    ' |: x9 v# l& U  k( b6 ^
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);( ^$ A6 K" H$ B6 a
  32.         printf("to me:%s\n",recvBuf);
    5 T2 e' ?0 y+ C7 R* T) E2 c$ l, N8 a
  33.         memset(recvBuf, 0, 100);; q0 X% q3 t* p' h
  34.     }
    - b8 `% g% B3 v+ Q
  35.     closesocket(sockClient);
    0 C% k9 Y2 A- I: h& O2 g$ |
  36.     system("pause");
    ) B0 V6 G2 M' l# b
  37.     return 0;
    $ A6 d9 Q5 g& d1 q
  38. }
复制代码
客户端代码:
+ p4 X9 V+ I1 J7 z8 k) K; ^
  1. #include<winsock2.h>- }% f. o3 L; w- ~+ X5 ^
  2. #include<stdio.h>' Z1 r; V7 y5 C8 ?. U
  3. #pragma comment(lib, "ws2_32.lib")& V* e7 E' E5 f; i& p$ O& N& l) y
  4. void main()
    # Y9 K& `3 J/ ]3 S3 U, {
  5. {
    $ g) \7 Y7 K8 j
  6.     WSADATA wsaData;
    : A* ^3 c0 w! K4 o% o+ P
  7.     SOCKET sockClient;//客户端Socket# A8 C; j6 _6 e% u9 [; d, G
  8.     SOCKADDR_IN addrServer;//服务端地址
    $ [3 I  i9 ]+ p" ~* O: j- F
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);/ F9 G" a4 w4 g
  10.     char message[20] = "HelloSocket!";, \+ S8 A, l$ i* q
  11.     //定义要连接的服务端地址. H) M2 h0 x5 y
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    9 w7 _' v' t: P7 Q8 D4 }
  13.     addrServer.sin_family = AF_INET;) x* v& K" }) X5 E$ o& e
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ( ~9 v8 h8 u, M( v- g/ v" V
  15.     //新建客户端socket1 w. H; R1 @5 Z# P7 X6 Q: J
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);5 H" f: a3 L3 n4 |3 v
  17.     int s = 0;& a; c  l: K* [. n; R: S6 `1 U
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ! I. X; M" L# g, p+ V: H! O9 A7 l

  19. 6 Q, z* _% R. n5 F' H+ K. P
  20.     while (1){: j4 H, N6 y& U3 @4 E& C1 D
  21.         //发送数据
      l! ?& t' Q. o3 G/ ]6 c' C
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);, t7 ]1 }9 U" F  b. O! E6 y
  23.         printf("to server:");( K: w( D' C7 ^6 m
  24.         scanf("%s", message);; w9 h5 e/ j6 _1 \9 E0 `
  25. . t/ q. w* _9 ?, c' U5 s
  26.     }
    " m3 h# l( w' X6 [) p6 I1 f/ P2 S
  27.     //关闭socket
    : p- A8 g  g! b1 t- P
  28.     closesocket(sockClient);
    3 M. W& B' P0 j- x" y  N0 E( J
  29.     WSACleanup();
    0 D( \' ]6 _% O, J9 D' V) Y* f
  30. }
复制代码
求懂的高手来解答一下。5 x6 {0 k* z: H* b  Q
谢谢了!
# q  _( S: K$ H' j! r# V+ f& S

1 I4 i- l% p* f! ]/ |0 I( q# s6 r. B& H0 B
$ y* h) h7 B' n: A/ L" `5 X7 B% R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 显示全部楼层
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 显示全部楼层
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为) O8 ?/ u, n9 {1 S8 S' a
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-5 02:47 , Processed in 0.113775 second(s), 18 queries .

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