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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。0 B3 |) w: i- j1 j  `, O% q' y5 W
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。8 q7 C9 k$ q' w' Q. x
Talk is cheak , show me the code.
8 X! i) X! D3 v; @; H4 l服务端代码:/ j, E8 F6 N  {% W: S6 K; R
  1. #include<stdlib.h>6 ~2 ?$ Y) y2 k% h, D% i* O
  2. #include<WinSock2.h>
    9 g( S8 N$ f" [) i7 `" c. W9 v: |
  3. #pragma comment(lib,"ws2_32.lib"): _5 N3 \6 E1 J" N' C/ a' ^
  4. int main(){
    0 H/ I4 [( l9 }1 C8 k
  5.     WSADATA wsd;9 ]: p7 G7 i/ X+ U
  6.     SOCKET sockServer;  D) n8 [' J! Q5 m0 I! g7 ?
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    & \9 z3 j; N4 N2 q( s5 S( d
  8.     SOCKET sockClient;
    * Z& @( B" g4 l7 Q  p0 W8 W8 r& @. f
  9.     SOCKADDR_IN clientaddr;  T* @% Q# a% L
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    8 z5 W3 v; ~% w7 I# ~3 M
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket- q7 d; j. |8 L
  12. $ _# M* U* ~1 T5 P8 U
  13. * d$ Y5 V9 \/ W0 r( }6 \
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    5 V" L; v. m9 V* z& [  ^1 d2 ]; K  a
  15.         printf("Socket has been created :%d", sockServer);' ?$ W1 F% o; T7 }8 D
  16.     }
    6 [& ?' }3 U/ \9 m
  17.     else{, p; v  G7 l8 m8 y( l
  18.         printf("Socket create failed.");) J% l# z4 _2 T' c2 m
  19.         exit(0);
    5 {: Q' k3 t& i2 N, A$ g
  20.     }
    ' S$ R: F8 E1 f- _6 g
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ) i6 m, t) F# H6 Q1 _- i
  22.     serveraddr.sin_family = AF_INET;  x" C0 b! W+ Z% N. a8 w3 l
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    3 R# W( ?6 D$ J" e2 K! J6 I4 u
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));1 x8 c* \/ ?$ w  V  n5 a) F/ w' R
  25.     char recvBuf[100];1 l# E/ g! L. T" H% i/ n' C
  26.     int len = sizeof(SOCKADDR);# u3 J' K+ d; [/ K9 J) G: e8 L
  27.     listen(sockServer, 5);//5为等待连接数+ R: a* ^& C( W# ?# Y+ x
  28.     while (1){* Z. u' _) J; b+ j/ G  H
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);7 \$ b! H) B5 d; e: e
  30.         //接收客户端数据% j; M/ ~' D# U* q
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    & g, w7 L% L3 Q( [) i7 H
  32.         printf("to me:%s\n",recvBuf);$ x( e! @- |/ Q& S
  33.         memset(recvBuf, 0, 100);
    " G" Z0 H9 U2 Q5 w/ A
  34.     }
    ( ?% @( E7 s' n9 v- ]6 E# _
  35.     closesocket(sockClient);
    4 F6 L: F% t5 [" G! d; A
  36.     system("pause");' W9 ?4 R( \( C& x( |
  37.     return 0;+ s. G/ ~! H; D( w$ Y
  38. }
复制代码
客户端代码:
; q" C. N# [( Y; ]/ Z2 s% d1 f: S
  1. #include<winsock2.h>
    ) z) K5 z3 h4 A9 }
  2. #include<stdio.h>
    ; e5 \) I& \( u# ]
  3. #pragma comment(lib, "ws2_32.lib")! X: X7 j4 Q( R# I
  4. void main()
    ) l5 }! y3 P$ q3 B
  5. {; w  L! X% n3 S  k* A/ i: L: F$ _
  6.     WSADATA wsaData;7 `: X# Z5 p* M
  7.     SOCKET sockClient;//客户端Socket) s# Z' N, T7 \$ r
  8.     SOCKADDR_IN addrServer;//服务端地址  m5 R2 F. @6 P$ w  t; B- W
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);0 J, r; B& y7 L
  10.     char message[20] = "HelloSocket!";" b; i" @8 r. G# I* B9 J
  11.     //定义要连接的服务端地址
    % S4 D+ A- u& B# B- w
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    : ], k$ U& V+ x: g2 x. O
  13.     addrServer.sin_family = AF_INET;
    9 R/ ?8 v2 V1 T& t1 ?+ f9 A( h- {# y
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    + r0 n4 w8 n# h. s
  15.     //新建客户端socket
    " ]( g. v% {# N7 `
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( A/ k6 b+ r1 P
  17.     int s = 0;
    2 e) n+ k+ Q' q4 J; Y. K
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    " n6 j6 c+ W& B9 r7 l  h

  19.   Z4 F: _" [5 V* h# h
  20.     while (1){
    3 d: E" w9 g: ^6 S) z& S( j
  21.         //发送数据1 w( G" i' J7 F0 Z1 V
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);- W9 v/ \& F$ X/ m* p4 z; o% |" r% d
  23.         printf("to server:");& c' }  a# s2 w2 Z& U4 D
  24.         scanf("%s", message);
    ) L9 l, q) |' {5 @$ c

  25. " q: o' S) y5 C+ b% ^
  26.     }
      A" S: X9 t, e: f- }* T
  27.     //关闭socket$ y5 L, V5 a+ [! I4 q) M4 t
  28.     closesocket(sockClient);
    , Y  z4 S9 u2 Q" l- Z
  29.     WSACleanup();
    7 v7 C9 p/ C: Z
  30. }
复制代码
求懂的高手来解答一下。& }9 i; r5 q7 r2 C; a( h% p' D  q
谢谢了!
1 R( S' D+ L) o3 M! w7 s

3 }+ {+ c. ?- {5 D: S- e, r4 a7 ^6 Q" v& L8 E

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

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为% P- n% _( g) Z; ^. p
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-5-2 11:45 , Processed in 0.092075 second(s), 18 queries .

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