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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。& j/ g/ u5 l: I+ b: `# s, M
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。! }8 }2 I# a" N9 K
Talk is cheak , show me the code.* c" O( @& Q1 f
服务端代码:
, e) R0 c% Z7 c# T8 j
  1. #include<stdlib.h>
    ! V2 x$ _) X, l- v5 L% v
  2. #include<WinSock2.h>3 j, d4 J% C3 Z: w, }/ p- V& p
  3. #pragma comment(lib,"ws2_32.lib")1 Y1 i; H0 S2 [% h; `0 `0 e
  4. int main(){& u4 M( c* |  h) H
  5.     WSADATA wsd;
    & r  D) ^* f; c  ]2 H5 `7 \8 o
  6.     SOCKET sockServer;3 r$ f$ C1 H9 L1 l  n( D3 C* a) V
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号, D  F: y* Y6 E# }! H
  8.     SOCKET sockClient;& w8 y) F5 B0 {6 V% p  r
  9.     SOCKADDR_IN clientaddr;
    & B% c  U0 B& y0 q$ n" i
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ! ^5 Z( [: b: w& H: \& o  X2 }
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket. Q. b% X/ Q1 Q; \1 O
  12. 8 M, ?$ K3 \' O7 S: g% T

  13. " Z/ ~6 u; g# T( O' I
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    : u" `5 T- s& r+ {
  15.         printf("Socket has been created :%d", sockServer);
    / C- V3 t  w$ @* o% I, n6 `
  16.     }
    % M6 x) R; }' e5 Q# e0 m
  17.     else{6 W! ?+ }" P! y+ q/ ]
  18.         printf("Socket create failed.");
    8 {% f( D5 K4 v4 q: l$ `
  19.         exit(0);
    5 a- @* T1 L5 a5 B' e. r
  20.     }+ m% @4 k6 `4 {) s0 ?9 g
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);7 S7 ~7 T  W1 O
  22.     serveraddr.sin_family = AF_INET;
    ) I# S4 u( B. S0 x
  23.     serveraddr.sin_port = htons(6000);//绑定端口60002 A3 [$ `5 C" @7 M. \4 a; N
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    % `4 f. f/ K% Z- b5 f
  25.     char recvBuf[100];
      H7 z  f7 d% {" V7 Z1 A9 M1 x! b
  26.     int len = sizeof(SOCKADDR);
    ; L; z6 z, k6 N$ }8 K2 S8 O
  27.     listen(sockServer, 5);//5为等待连接数2 r& ?8 E, s! h8 x4 y8 |0 t& L9 b
  28.     while (1){
    2 T. Y6 X& l2 E. T. c; j
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);7 t" C/ J! e" g" ]. j3 |6 e5 [
  30.         //接收客户端数据* L/ s; J# X! m, P  E
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);( t% K+ W3 i1 C
  32.         printf("to me:%s\n",recvBuf);
    $ G( \  R+ \5 T8 X7 y, \
  33.         memset(recvBuf, 0, 100);5 J9 }7 M4 K2 a  B
  34.     }/ M# e1 k: W" c, z
  35.     closesocket(sockClient);
    0 x) b& T9 f. y% ^; W  ~$ ]
  36.     system("pause");# R& P3 V& K1 G
  37.     return 0;
    $ }3 j8 _7 {. W) A) d
  38. }
复制代码
客户端代码:8 L1 n, g5 s+ e
  1. #include<winsock2.h>. c( U3 z3 z! U& j, {+ ?- e
  2. #include<stdio.h>
    " \9 `9 E1 L) V1 u) g; S
  3. #pragma comment(lib, "ws2_32.lib"); z6 u* s: }+ ~0 j$ P+ o9 C6 j( j+ t
  4. void main()
    $ U. }5 _5 q9 T9 r2 c0 r7 P. O
  5. {; a# A) M& E/ a9 h
  6.     WSADATA wsaData;7 i8 L2 e4 d" _; u  j
  7.     SOCKET sockClient;//客户端Socket5 ^* y1 r7 q) ?5 `# }- L' O
  8.     SOCKADDR_IN addrServer;//服务端地址
    9 y8 Y* q" c3 w* O; ]) }  O" T* H
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    + ]- Q0 j+ D* Q3 g3 Q4 c9 T
  10.     char message[20] = "HelloSocket!";
    6 z$ B* {3 Z- m
  11.     //定义要连接的服务端地址
    1 i1 ?# J/ s8 C4 n
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)9 |9 V. X4 e" A' ^, l. W) T
  13.     addrServer.sin_family = AF_INET;6 o; w0 v6 V& d" I& T: |
  14.     addrServer.sin_port = htons(6000);//连接端口6000- A0 ]. u; t8 g5 `, t
  15.     //新建客户端socket
    / B( x( O, F! R0 c$ V3 r# D# v
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ( y; \2 g; H9 E( H) F
  17.     int s = 0;
    8 H- \" C; \. @/ l
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    8 V2 V: c/ o1 [; a4 G+ B+ m. K! v. v
  19. 8 Y1 Z$ T& J3 E' @% A
  20.     while (1){
    6 W/ k1 f, |5 T% [# {) i0 k
  21.         //发送数据* P) h7 v2 D6 [1 }+ Q2 Z9 j. f
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);' Z: \% X/ `& B% q. w6 ?
  23.         printf("to server:");: ]' m4 b1 P8 h, u# L4 n3 M
  24.         scanf("%s", message);/ X: \" J& i9 P+ Y

  25. 2 L# c; L/ p% P8 t
  26.     }# q' G; j; @, Z+ i: _
  27.     //关闭socket( c  E) q6 ~0 d
  28.     closesocket(sockClient);
    5 L7 t# f8 m! q$ T- p- t1 G
  29.     WSACleanup();, O8 E! |4 w- v9 p* S% G6 P8 M
  30. }
复制代码
求懂的高手来解答一下。
8 f. R* z3 C$ z* z谢谢了!2 I. \$ m7 I6 N8 }- y1 d
/ {5 r7 @& Z1 C4 Q" I
8 t6 x- i: E. d

$ J0 C3 c4 I. ]( L, B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
  L+ _# ~! w; b, V) ^recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-4 11:49 , Processed in 0.077715 second(s), 18 queries .

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