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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
- i3 O, H3 A" A& Q" Q我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。, U; A9 Z8 d# J! Y
Talk is cheak , show me the code.
$ P( Q" `- e( _. B8 m3 g服务端代码:
+ W) b- w* ]4 b0 B: Y1 S3 W$ x
  1. #include<stdlib.h>
    : b( M' e6 v3 e% e  l
  2. #include<WinSock2.h>1 I& [) M' l- W4 a5 c; E2 [7 S
  3. #pragma comment(lib,"ws2_32.lib"): X: G# o2 S) `6 @/ `* p. ~
  4. int main(){
    9 B  a. x- q2 V$ @/ X
  5.     WSADATA wsd;) K$ y) j. ^7 |5 Z3 q
  6.     SOCKET sockServer;
    ' {& s/ F# U) M* f" J$ q
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    0 U" a5 E) i8 _( Q  M
  8.     SOCKET sockClient;8 G% ^/ s5 [; `' X
  9.     SOCKADDR_IN clientaddr;
    + I  l) j) g* y$ A; U6 y' Q2 d& d3 S
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ j$ e1 C2 |- Z% J, s% b; v1 T
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket$ d2 P8 W0 f) ?) N: H% K* C3 [1 H

  12. / `, M& G  {3 e8 M! @  J' U  O' X

  13. " u; b; f, W3 i" t
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    * M/ |1 }: a& |6 Q! \+ z8 N& O
  15.         printf("Socket has been created :%d", sockServer);
    0 b5 E9 L8 |* e& o% ]+ f- ?
  16.     }
    * v% l1 p, [$ V  s& B0 g
  17.     else{- B  d  Y# f1 O: g
  18.         printf("Socket create failed.");7 }' [7 H6 M1 ]9 {- ~) m; K$ ~
  19.         exit(0);, g5 V# r/ K) v% N' Z; f
  20.     }& Q7 L' R) D/ K+ p( W) Z# h4 F
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    / R, u2 c; c$ _% E# I5 P
  22.     serveraddr.sin_family = AF_INET;
    : R0 w$ h% g% a$ ?3 @
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    1 P7 ^6 u" U5 Y  R% N8 h9 ~
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));6 A) p" S) \' x/ Z# W' s
  25.     char recvBuf[100];; D4 c8 a) L1 f4 }% Z) x
  26.     int len = sizeof(SOCKADDR);# O: w  J$ c0 I
  27.     listen(sockServer, 5);//5为等待连接数: ?# N5 @% B. \3 F3 `
  28.     while (1){( {9 m% W# L. `0 O
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    & B9 B. h7 G4 J6 x
  30.         //接收客户端数据
    ! `) {1 J( I$ p) @& z
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    # g/ X- l1 f3 |: V( w: v) O3 Q
  32.         printf("to me:%s\n",recvBuf);& ]* ]7 `* B1 g+ |; J9 u7 t
  33.         memset(recvBuf, 0, 100);8 N% y- Y2 r& @) x& P2 L
  34.     }# M  Z( x  z: w0 g
  35.     closesocket(sockClient);
    - @, b5 S. i! Q) n1 D$ E# R
  36.     system("pause");
    0 Q6 v/ B2 @7 T" r
  37.     return 0;" s! w, a6 E3 U7 f! U7 k
  38. }
复制代码
客户端代码:6 F4 p! b+ m4 x
  1. #include<winsock2.h>
    . Z4 Z7 s& O9 }* v/ _2 m
  2. #include<stdio.h>
    ' {& L- Z+ \' p' A3 r& W
  3. #pragma comment(lib, "ws2_32.lib")
    7 i- N9 j7 q: Q6 Y# I
  4. void main()
    8 K9 `4 Y, b) F$ S& L
  5. {) k+ b6 J' ~$ a% m) D
  6.     WSADATA wsaData;: w7 e1 {) M& z- [9 Q
  7.     SOCKET sockClient;//客户端Socket
    9 i& b3 o* ]$ {% M; p
  8.     SOCKADDR_IN addrServer;//服务端地址: y$ S9 k) y9 `# ]% I2 {2 m0 u! p
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);7 E6 _- O/ E7 ~; X( J$ c
  10.     char message[20] = "HelloSocket!";
    & g% C" ~$ j/ c
  11.     //定义要连接的服务端地址/ H2 ^% K* M% D  f8 U
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)8 x3 G; n( v) r2 q) Q+ a! o& T3 g
  13.     addrServer.sin_family = AF_INET;
    9 p" B; ]/ J. l. U& r8 y
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    # n8 s! j' [4 y& i3 j8 `9 h
  15.     //新建客户端socket
    . p- b- M& z0 t5 u7 G% r# y
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);5 P/ E1 f, t: M
  17.     int s = 0;
    ) E2 i1 g# |7 k' y; t/ a8 g
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));0 l, ?+ S# R) p" j
  19. 5 ^; e9 ]: W, ^* G$ ]; Y
  20.     while (1){& P1 a4 F2 g3 b( W: S& r# L) X
  21.         //发送数据
    0 [8 ~" h) n# s7 ?0 j
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);8 ?* q! G8 n$ Z$ ~5 d
  23.         printf("to server:");. Z9 a4 Z$ W( w& ~% u1 y) U
  24.         scanf("%s", message);% ?, ]; |9 Y; f% r
  25.   ]9 X( k: b; {
  26.     }
    : ]/ C- o( D8 l: ]& v3 e
  27.     //关闭socket
    - N: G% W. |. O: L: _
  28.     closesocket(sockClient);7 T$ `; }* q, V& T' J
  29.     WSACleanup();5 W' k7 Y4 _1 @* T
  30. }
复制代码
求懂的高手来解答一下。4 t% _1 s: o6 y% I* ~( M  ]
谢谢了!2 {9 S" O7 \5 N
- X0 `6 @$ _2 q* E% `' M9 @, Z0 s% p

) G* M1 X& S" G% `2 m% \7 T! |1 {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-20 04:36 , Processed in 0.102514 second(s), 18 queries .

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