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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
+ T8 G" |0 U3 q" t/ J, A3 q# k; ]我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。' l4 T7 U" T# d6 e, d2 T0 D
Talk is cheak , show me the code.7 j2 q. Z  p# A
服务端代码:
) O5 }5 ]  u" f4 T8 I# E
  1. #include<stdlib.h>! y7 {' X2 L) Z0 L8 D* G+ H% B
  2. #include<WinSock2.h>
    " \5 B/ h0 T# M) Z
  3. #pragma comment(lib,"ws2_32.lib")) b, o1 ^7 }9 L& q' i. p9 `
  4. int main(){0 |* g* B. [5 f# Q1 G. d* X
  5.     WSADATA wsd;
      K' a! p2 D9 b, J7 A# m& L5 M
  6.     SOCKET sockServer;, @. r% L9 z' w! U7 `! a) x/ o
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    + W# @, S; c) m- W; r# r
  8.     SOCKET sockClient;& Y! ]1 o  U1 F$ S1 D
  9.     SOCKADDR_IN clientaddr;
    ) N5 L( N1 K, c1 D
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ( t( v  F  R9 w2 W
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket; e/ L* v" @6 V/ S
  12. 3 a9 O( L9 G; h9 E5 }
  13. $ M+ Z! J0 D! c+ `% a
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){' ^1 E* }+ p$ h! S7 D
  15.         printf("Socket has been created :%d", sockServer);
    , v+ D2 [: R! o) x& b: X* O
  16.     }
    * G) B, f2 Y7 V: D# _' o( I
  17.     else{7 ?# |* ~& {+ h
  18.         printf("Socket create failed.");' G7 I6 w/ B! y9 C1 ^3 y* w# s! D( Q
  19.         exit(0);
    2 l+ ?5 z7 p5 {4 {% C+ V/ Z
  20.     }
    6 i5 S. d2 d6 R
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);! P$ |# E+ P1 X$ y  ?! t0 t
  22.     serveraddr.sin_family = AF_INET;, x9 m, E- G8 H9 {
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000) L! \! g5 c+ C* p( V- `3 j* V
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));$ w; i" ^& `2 c' d/ ^! q
  25.     char recvBuf[100];* v& M  Q! h$ D4 ^/ x) G; t# S1 D
  26.     int len = sizeof(SOCKADDR);
    2 ^" C9 H3 X6 D, I( v$ m" {/ r
  27.     listen(sockServer, 5);//5为等待连接数
    $ f( E& e* h9 y- Y4 s. r2 b
  28.     while (1){
    5 T/ w. S5 [- |  K* ~1 l- J9 T, q
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);; f$ u2 t- g! h' o8 _
  30.         //接收客户端数据  d3 c2 I' G; D  m
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);# P! a1 k2 z: b
  32.         printf("to me:%s\n",recvBuf);% R  G1 Z  E9 O4 H7 l
  33.         memset(recvBuf, 0, 100);; T: B- {5 ?3 u/ P2 a
  34.     }
    ' Q, |3 q) l6 b- A2 @% d
  35.     closesocket(sockClient);( p0 k% s. H, G/ L0 @
  36.     system("pause");
    ! R8 M, O3 `" o5 M' V" \+ e6 e! N" m
  37.     return 0;
    # `$ m3 O0 o5 z) x7 Q
  38. }
复制代码
客户端代码:6 [) r& D: \  O/ }9 L0 c! ?2 h  a
  1. #include<winsock2.h>3 {& [6 ~8 [" r+ B
  2. #include<stdio.h>, \$ B" x1 U, b' o6 ]+ W
  3. #pragma comment(lib, "ws2_32.lib")
    ! k) I8 A) m9 c( H% h1 D# ~, \8 ]  y0 p
  4. void main()) B0 R4 O6 X! S4 y+ D
  5. {
    5 x# \: a1 ^; ]3 z; C- s3 D5 \
  6.     WSADATA wsaData;# x! U. e- G, ^7 n
  7.     SOCKET sockClient;//客户端Socket8 I. n  O+ m0 C" D
  8.     SOCKADDR_IN addrServer;//服务端地址2 [5 C; S9 |2 _# S$ z* s. p
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);3 z9 @6 m( Z3 O0 T; D7 H
  10.     char message[20] = "HelloSocket!";
    7 k3 \; V4 O; _8 K# n  L
  11.     //定义要连接的服务端地址" {0 b- R) R! W% Q3 e. |- m
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)0 z5 c1 d. }1 r: T3 N8 k
  13.     addrServer.sin_family = AF_INET;& G* M2 |' h7 `2 q3 i
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    " u: v% S/ r" C( H
  15.     //新建客户端socket' L' u' h  i5 D* {6 \
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);9 K; s3 u* C! ]" Z! ?9 J% x
  17.     int s = 0;; K6 V9 ]; {2 I4 a# a& t
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));  E* L& @5 J3 E1 `# D$ L
  19. ! T/ L, ]+ o: h- ~+ f9 j& c: l
  20.     while (1){
    + F8 D0 K; A- Y, B
  21.         //发送数据
    . N( `8 n6 [4 d- F
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);: r" @1 ~, ~4 K" r0 o" b4 G
  23.         printf("to server:");( w( b  T2 F! K! ?; `/ b2 i3 o) M, j
  24.         scanf("%s", message);; F: k, i' @  \3 a

  25. * C3 N5 \1 |9 h& N8 M& ~9 F
  26.     }
    4 L. h8 F8 I# ]; G4 Z$ D# D" J
  27.     //关闭socket7 m7 I/ x1 N% }
  28.     closesocket(sockClient);
    $ b: P$ k6 e) _+ a! k1 J3 ?
  29.     WSACleanup();
    ) P( x: I, g$ c9 f4 o
  30. }
复制代码
求懂的高手来解答一下。
8 [# t7 m" q, V) ]谢谢了!
' r% X: {' ], |- L+ o6 ~% Y

8 F  W! V# h5 h, A" e0 x- ~9 P, ?: a, e% r6 m% C
2 u2 s- X9 Q7 ?- L3 G4 j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2026-1-30 14:31 , Processed in 0.066126 second(s), 18 queries .

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