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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。$ j6 n2 d6 ]; {- N& x
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
) z# I5 h) E( f: [" U% L( u- QTalk is cheak , show me the code.7 j+ O- z5 A" l
服务端代码:
- g* A2 ~! T. j6 ]" A( ^
  1. #include<stdlib.h>2 k& ]+ u2 Q% y
  2. #include<WinSock2.h>
    3 x; B: C; V) E& W5 X$ ?. ^
  3. #pragma comment(lib,"ws2_32.lib"): d5 n( v) q; P- H4 @
  4. int main(){
    + `4 w( J% @/ k" u
  5.     WSADATA wsd;& q+ w0 n9 O6 B; _7 D. L; r: K+ S* ]
  6.     SOCKET sockServer;8 r+ w- u" \- g
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
      Z3 `/ A" c5 N+ [0 a8 r& R' @
  8.     SOCKET sockClient;) \# K. n/ e$ v
  9.     SOCKADDR_IN clientaddr;
    8 Q( N; V3 b+ U
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* m+ C* S9 m; ]2 Y
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    5 r: q3 F, u- s' n0 s" e7 v

  12. + q4 Y& S8 n7 B; @; Y% }3 d

  13. 5 Z* J* Y) A8 n5 G6 j
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    6 |& v& e- R/ J7 ~, O2 s0 S, Y( X; S
  15.         printf("Socket has been created :%d", sockServer);3 A: u5 J+ A- r% z. `# @+ Q: X
  16.     }9 M4 o$ R. J* `/ `- m
  17.     else{
    ! G% o) z5 ]. B+ {- ]* n
  18.         printf("Socket create failed.");# p8 N. z0 x  [, y
  19.         exit(0);* V8 F1 c0 B0 R) k! Z3 T7 o
  20.     }$ d2 r% o0 I8 ~7 V6 t
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);/ b! j* s7 R9 H- g. v9 c1 q
  22.     serveraddr.sin_family = AF_INET;
    $ @4 B9 ]8 j7 K) n9 u2 a; h
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    & Q/ Q1 G* n$ s, h- c/ D- V
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    " Y$ x! }. O# S- J
  25.     char recvBuf[100];. r& F7 b" ]+ S" f  e
  26.     int len = sizeof(SOCKADDR);
    1 k4 W5 i$ T0 Y$ f3 H. p6 G# x* E
  27.     listen(sockServer, 5);//5为等待连接数
    7 P9 }( z* y% B# h" R- J5 `
  28.     while (1){
    2 J- u$ }- I; N$ k2 Z2 z/ b+ v
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);8 G8 P4 p  P# Y9 d
  30.         //接收客户端数据
    / Y! Q1 x% R( R1 s. O$ v
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);* v5 R9 `( h1 `7 ^$ V, b, V6 Z" U- P
  32.         printf("to me:%s\n",recvBuf);
    + x$ ~, ~/ [! z( ~* `% A
  33.         memset(recvBuf, 0, 100);
    4 ]0 b; j& `! V, p8 F
  34.     }; L% z& H  n, v) l* t; Q
  35.     closesocket(sockClient);
    2 I( e, a. `1 @' n
  36.     system("pause");4 g) d$ |  E$ I) D
  37.     return 0;7 ^# A- V7 X0 E: a" x4 `
  38. }
复制代码
客户端代码:
8 P  ~& c" t4 z5 Y: ?
  1. #include<winsock2.h>
    $ f+ r% @, i' X4 q# c  i
  2. #include<stdio.h>
    5 \  h* s8 M5 ~5 H4 }
  3. #pragma comment(lib, "ws2_32.lib")
    ( t$ E6 m9 P2 R7 `, {1 N& G+ w
  4. void main()3 t5 Q, K) B. u4 B7 [) t2 k
  5. {# B: Z% f4 b9 Z3 ^! D- W
  6.     WSADATA wsaData;2 }$ d" a( h' {* H3 z9 @& R$ d1 r
  7.     SOCKET sockClient;//客户端Socket2 g1 B+ Z/ G/ p' B
  8.     SOCKADDR_IN addrServer;//服务端地址
    8 m. A7 a* l# c: J/ @8 _& Z
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    6 {& D/ i+ U* k8 N' e- H
  10.     char message[20] = "HelloSocket!";6 ]0 E: |2 `# ]' V
  11.     //定义要连接的服务端地址7 ?/ O& m3 E3 i* w8 o+ c) k  w
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)+ B3 V7 S6 F8 S5 C+ }
  13.     addrServer.sin_family = AF_INET;& b& v) k- }& P
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    1 j5 ^! W$ R' b6 J
  15.     //新建客户端socket
    ; b0 v+ o0 D$ l" l
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);. y$ d- o" R$ B: q$ s
  17.     int s = 0;
    2 V  e; i; U* ~8 J. I9 h" l' H
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: ]6 D2 n* k) @+ q' R
  19. " p6 x( \+ G7 {; C, y
  20.     while (1){
    3 |( {. j! B( [
  21.         //发送数据- w" U9 t3 I& ^' y1 a, A( q. C
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ! ^! `4 a/ x- e/ \: j" ^. q
  23.         printf("to server:");& j! O" g2 c3 O* ~* n  i6 O
  24.         scanf("%s", message);- }& p2 \. ?; w7 ?1 ?8 p
  25. 4 G: s- ~3 B7 D4 ~  ^2 U+ d, h
  26.     }; r0 D% z9 N& @: {4 i& _( W: t# t' P
  27.     //关闭socket3 m# S  r  ~) |7 g$ @
  28.     closesocket(sockClient);( }5 r, l2 f5 N  s# S/ M
  29.     WSACleanup();7 y" S; x5 K# Z& B  ~. v8 t" g
  30. }
复制代码
求懂的高手来解答一下。
; h: v/ c5 B: F( v8 E' K谢谢了!, \% p! ~+ p, i4 k/ w

: ~" h  [( {$ t: _+ a2 N, _) c% Y' O& l, g) D. X
. }2 a- v$ J) i8 l2 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); 这句改为
- m- q6 V, y3 }1 j  Irecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-3 22:56 , Processed in 0.108537 second(s), 18 queries .

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