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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
- x( A! y9 s' L! U% ?% `我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
- W+ G$ B8 T* f! R/ mTalk is cheak , show me the code.
8 q( F/ {) F! R! v" ]( T; t- H' I服务端代码:3 r$ G) Z# u9 t/ K* J: y
  1. #include<stdlib.h>
    9 w2 ~: x& e/ z% E. k7 c
  2. #include<WinSock2.h>, z8 Y( ~2 x- D- o* S) E$ {/ \
  3. #pragma comment(lib,"ws2_32.lib")
    5 Z  |+ z& _. S$ P% ^/ D' w2 f
  4. int main(){7 ^4 S8 \- @2 L2 L, ^
  5.     WSADATA wsd;. s8 J% G& ]( n' K; ?' Q: O" }
  6.     SOCKET sockServer;; G/ H; ~) R6 [+ C
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号. y4 F# i+ G( w: P8 F
  8.     SOCKET sockClient;' C4 v, y$ F) j6 \
  9.     SOCKADDR_IN clientaddr;
    / ~/ o7 }) r5 p6 ?2 y
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    6 ?$ Y' c# O5 _- A9 u& g9 {1 N
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    1 r6 R$ ?" G7 C- v
  12. , {" W' h; `( j) v

  13. - f8 z' c$ K7 j* `; L1 R
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){; R  b) p. \/ ^5 B, r
  15.         printf("Socket has been created :%d", sockServer);
    7 f3 n0 l/ O4 F, y8 d
  16.     }* t% y, r6 S3 l4 F& ~4 P  E# V
  17.     else{
    7 w2 A/ c5 T+ v3 i
  18.         printf("Socket create failed.");- C; S& d3 _+ l& J* ]
  19.         exit(0);+ T$ t  r0 F) C1 m" W3 A: e/ o! ~3 E
  20.     }3 o; P/ q: W1 i( `* L
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    % P8 m6 l/ h% W$ f) b1 K, {' H
  22.     serveraddr.sin_family = AF_INET;
    2 d5 M. O5 o' ~/ }3 W. w3 t4 q. k
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    4 O9 K. A6 X; @
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));' f$ d( T. c. i0 v% S" ~  e
  25.     char recvBuf[100];
    : p) y) }. g/ \9 T; X3 R2 f7 X
  26.     int len = sizeof(SOCKADDR);) T; w& B0 D' e( h) P
  27.     listen(sockServer, 5);//5为等待连接数
    4 j1 l/ o2 `) q$ ?5 D' y" d
  28.     while (1){' e2 f, s; Y5 J8 u+ w, q
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    . U( h+ j* \  Y3 v
  30.         //接收客户端数据( y' v# a4 z& {8 a  ]4 f$ F8 j0 h
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    6 U2 x7 U, b  l9 T* l4 X8 C! m
  32.         printf("to me:%s\n",recvBuf);) g. @8 G3 q2 p  C4 c6 A- d' b
  33.         memset(recvBuf, 0, 100);
    . F, M1 Q1 D  ~8 m4 h' n% ~
  34.     }3 c$ A% Q1 L: |3 K' e
  35.     closesocket(sockClient);
    ! I( B" h4 R! i9 l* M. _
  36.     system("pause");( F  g) k; z6 O4 O, q8 N: C, r1 W
  37.     return 0;
      ?, d; R1 L4 ~( c( X' H0 _6 ]! h
  38. }
复制代码
客户端代码:" _! C$ O: H( N
  1. #include<winsock2.h>9 U! J& u8 E; v! U8 X
  2. #include<stdio.h>+ T1 C7 r6 Y0 _4 p
  3. #pragma comment(lib, "ws2_32.lib")
      v5 Y9 F0 L3 I; R) j$ D8 N
  4. void main()
    / a1 D! Y- q& U$ A
  5. {+ T! o4 ?7 y; d0 D2 Q* S
  6.     WSADATA wsaData;( n3 {8 n# S4 ~# K/ ?7 }; W
  7.     SOCKET sockClient;//客户端Socket
    1 F2 a: h( R9 ?8 d2 v
  8.     SOCKADDR_IN addrServer;//服务端地址" W* e5 y3 ^9 A( q( B
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);2 t1 i2 c  t4 V- }# _  N3 A# [
  10.     char message[20] = "HelloSocket!";
    ) v% ?  k; B4 |. y
  11.     //定义要连接的服务端地址* a1 C  C2 O: J0 Z! b. o
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    8 ?5 M( @8 _& z" q, U' o* s3 @
  13.     addrServer.sin_family = AF_INET;: n, c* X- x" g1 \* @
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    $ V  j# Q4 [  E+ y
  15.     //新建客户端socket5 X# l6 Y9 R: f
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ; X' g# w* x# A7 U9 `6 x4 q9 y
  17.     int s = 0;
    2 P) {0 x4 S, T2 ?" \, l  ^
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    3 ?9 a: I6 ^; |0 G1 u
  19. * E) C) G9 }4 E# e2 v
  20.     while (1){
    , z8 r0 C, a0 s* a
  21.         //发送数据
    + V$ l$ l  n4 @2 q! e
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);1 [% a; Y- n4 R
  23.         printf("to server:");( |! A* @6 M! a( q9 p# u+ d2 P2 ^
  24.         scanf("%s", message);
    4 b; R( Z. @. x5 J* z, J

  25.   q+ O; {* G4 d  m) ?3 o% ^2 P4 P
  26.     }3 s( U$ Q5 [( c9 Q7 ~, |+ G/ j
  27.     //关闭socket
    % A& Z0 X6 |! h
  28.     closesocket(sockClient);. E' F3 b6 q& [: _- m; @
  29.     WSACleanup();
    , I  K6 Z* s  o* S* }
  30. }
复制代码
求懂的高手来解答一下。
+ M# j& d, m# q谢谢了!
2 [" s6 }$ ~: u1 q. L

% @% A" ~9 N. `: ]) B
  s- m% V  t$ f0 @! ~6 n6 J
" p% z$ u+ I* \! H' K( f' w0 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
2 f6 |/ ^! l  i4 P7 }; jrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-1-30 08:11 , Processed in 0.050918 second(s), 18 queries .

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