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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
  h! Z$ o& `2 |; v9 i  ?. v7 l我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。" o9 Z# u& V# [" ?9 f/ S
Talk is cheak , show me the code.! ]. f3 B+ Z9 n% ^5 E# Q
服务端代码:+ P* G' @4 ]5 w3 P% \2 n% N
  1. #include<stdlib.h>
    ' K" w  a. D! P2 u3 S) F9 s, J0 y
  2. #include<WinSock2.h>
    " n' Y4 U) D$ d+ j" E
  3. #pragma comment(lib,"ws2_32.lib")
    + d  Q7 G# w/ t( b% d- U" R* o
  4. int main(){
    " C0 }! Q( @7 c
  5.     WSADATA wsd;
    . N" P* H4 d' H" m
  6.     SOCKET sockServer;
    , j' d& R8 M' Q
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    # p) h% Y9 P2 X* l. h
  8.     SOCKET sockClient;8 }+ K4 ^: ^5 j. D" Z" B
  9.     SOCKADDR_IN clientaddr;4 C0 R' G, b3 y* A8 N- c
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口# q* H- |3 S% F+ L1 L3 Z
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    5 Z; L0 Q( C) ^5 Y

  12. 8 C) _3 }: Z8 i/ `8 H$ j% P

  13. 7 Q. b5 G: G  _; |* V$ U" g4 Q# A5 R0 f
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    , p+ p6 [+ b0 Y4 C+ b% g" M
  15.         printf("Socket has been created :%d", sockServer);
    # p# |2 Q: _6 c4 U0 V9 y
  16.     }2 v3 e5 x- a9 j0 Q; \
  17.     else{
    & c- |+ k* w2 G& u
  18.         printf("Socket create failed.");
    + A5 Q; j* o" u
  19.         exit(0);
    4 x5 n/ k$ K+ X  t
  20.     }
    ) O1 a# d! h# k; a, S3 C3 F
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);# t! y0 L. t/ D' {
  22.     serveraddr.sin_family = AF_INET;" ^# n" n8 R8 A2 o" ^
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    & _2 ^, Q2 C2 Y7 T
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));8 j8 Y( V7 K" g
  25.     char recvBuf[100];
    0 T! Y+ ?$ }! [. q
  26.     int len = sizeof(SOCKADDR);8 v, n, T: V; x$ W+ Z! E
  27.     listen(sockServer, 5);//5为等待连接数; o) i* l0 ?# Y$ @
  28.     while (1){
    5 p* j( m( ]: P) i, D
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    2 I; y$ B7 j! ~4 E% o" h
  30.         //接收客户端数据* j/ M" P0 s. ~* Q; C. v/ ?# u( b* _
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);% |2 P4 ]# ~% [% t1 S( q0 T( N
  32.         printf("to me:%s\n",recvBuf);
    4 T. G1 n# g1 u% Z8 u1 |1 q0 P
  33.         memset(recvBuf, 0, 100);6 _: K: x3 i! Q) l: t
  34.     }+ F. A& V; @/ l- |& T+ }
  35.     closesocket(sockClient);
    & K3 w4 N9 x2 y
  36.     system("pause");4 j- J; y' Z1 ?; p4 N. M
  37.     return 0;
    . L, D2 ~/ T2 S/ P) k8 o! p% t
  38. }
复制代码
客户端代码:% }! v! s8 c+ m. C$ B, C
  1. #include<winsock2.h>+ H0 O8 [  G$ t
  2. #include<stdio.h>  ~1 w$ k. _$ V
  3. #pragma comment(lib, "ws2_32.lib"): X, r* }3 x4 j6 A  @$ _
  4. void main()2 e  N' k! v4 N% K/ p4 B
  5. {$ R6 q( r$ t6 r
  6.     WSADATA wsaData;6 G/ Q( o) V7 A( b! k2 U; z  L" r
  7.     SOCKET sockClient;//客户端Socket8 n0 a; g& X! z
  8.     SOCKADDR_IN addrServer;//服务端地址
    . ]0 v5 k6 m: X
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);: t  f* x  w5 \  y; L8 I: f
  10.     char message[20] = "HelloSocket!";  t6 ^3 F6 b/ n* C/ n
  11.     //定义要连接的服务端地址" z- Z& X, i: b* b+ U3 v5 F" }, E
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    : L4 T0 L2 v7 M  O" K; `
  13.     addrServer.sin_family = AF_INET;
    + N# d" p  u/ ~8 K
  14.     addrServer.sin_port = htons(6000);//连接端口60004 j2 J: E2 b8 W; ~( y6 q
  15.     //新建客户端socket
      a- _  Y1 E) d: N9 o( L1 l2 _
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* @8 y7 x. i, @1 Q9 H" {
  17.     int s = 0;
    8 k* w# j- ?  G! i9 m5 A/ X. z) q
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ' H( ^" m; ?% ]+ c
  19. " D) `; J5 f5 j4 w; R
  20.     while (1){) I1 ]' p  k. ?
  21.         //发送数据; H% l: k' d1 ^% g
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);+ }3 Z% C2 @8 n3 }8 Z. w8 C
  23.         printf("to server:");
    # a& s/ H4 E9 O) c- U( ]
  24.         scanf("%s", message);
    5 k8 z) n" _0 V

  25.   |; K0 r' F- b2 _9 }) C
  26.     }
    3 @; \+ p0 l. w7 \! Z+ ^
  27.     //关闭socket
    % ^# k* _6 o9 d
  28.     closesocket(sockClient);! S3 Y* D) B$ j" ^3 d0 X- z
  29.     WSACleanup();" `- K. d% W3 z
  30. }
复制代码
求懂的高手来解答一下。
# W2 ?5 z( p! E: d+ [/ m, m谢谢了!
* o0 e" q9 _9 r7 Q- e( g% X. O

. ^- {& W5 x" t/ f' E& ]& E. d6 e! R  H. T, r1 C6 S2 b  v! ^. j
7 g# K5 J& \" s7 T1 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); 这句改为7 y$ {6 w' q8 R) d3 y$ u
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 00:51 , Processed in 0.066897 second(s), 18 queries .

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