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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
, L* i# p! X- \. I5 }; ?% ^我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
3 X6 ]5 ~& X0 e* wTalk is cheak , show me the code.
. Y/ l$ W6 _" }$ I5 S3 k" ^1 Y+ [0 ]服务端代码:0 R# x* t  _* K2 ^) V7 W7 r
  1. #include<stdlib.h>6 b/ c* G! a- t8 H9 k. l
  2. #include<WinSock2.h>
    % H- G$ w$ e: X4 c, r2 T
  3. #pragma comment(lib,"ws2_32.lib")0 u  G$ g- R! M0 f/ v# e
  4. int main(){# k1 z% e! r! y
  5.     WSADATA wsd;2 u9 L$ \6 }7 B0 Y: ?- }4 H, W
  6.     SOCKET sockServer;  B0 N3 v" }* q: S, O4 c6 N
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号# v5 P+ L% _" h: X8 y
  8.     SOCKET sockClient;
    , ^. c6 x) I  P/ I: M6 D% C
  9.     SOCKADDR_IN clientaddr;) B" H! m+ `& x+ ^/ b# _! Q: ^
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口) {  O# [* A4 K9 c8 K4 S- V
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    % }( j7 f) @) F, s

  12. 4 b8 J+ X2 q& O: D( v$ ~

  13. ! N! e0 b% P1 w1 a; C& [4 l& q
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){+ y# R6 o% q: M+ P
  15.         printf("Socket has been created :%d", sockServer);% b4 x9 ~3 a/ x+ `- _
  16.     }
    7 O7 D( k: [4 z( M1 @) a
  17.     else{3 {, U! O- q7 c; C0 V6 e& b
  18.         printf("Socket create failed.");
    * A: A- O* F6 s& F
  19.         exit(0);( d  l7 q( ~# |$ W( Q
  20.     }, l0 h/ T, p: }) R1 |8 H
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    0 A7 ]: @$ z+ C# k- L
  22.     serveraddr.sin_family = AF_INET;! S) ~1 M* v3 W
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    ) Y5 e0 o. J8 ]$ t6 O5 ^0 a
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));; N% D0 X1 J8 [; {
  25.     char recvBuf[100];
    ( m/ N4 h6 i. P; e# P; u! T
  26.     int len = sizeof(SOCKADDR);  c3 a9 z3 o2 O  r5 a/ E- ?7 k
  27.     listen(sockServer, 5);//5为等待连接数
    6 S0 h' S* c) ?0 t' V& h
  28.     while (1){
    ; d9 A9 U1 Y$ J- F$ x% [% }
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);! C: i  O2 i4 E8 J' A( E9 w. |6 n! z+ {
  30.         //接收客户端数据
    8 D% ]& q& t2 n0 A+ o: W
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ! O" @, {* u+ A6 m0 H+ h
  32.         printf("to me:%s\n",recvBuf);6 B: {3 b2 y$ w, d* R. t6 i' A) G
  33.         memset(recvBuf, 0, 100);
    8 @7 _" o. y( z9 }. N
  34.     }/ g8 x1 ^: I& }
  35.     closesocket(sockClient);
    ' x8 _, H6 N# {/ z- @- }
  36.     system("pause");
    : k0 R2 W/ o& q8 V6 `: r
  37.     return 0;
    5 _) j/ }4 l- R6 _+ y
  38. }
复制代码
客户端代码:% i. O8 v9 F: P+ k0 f
  1. #include<winsock2.h>4 G; m: {3 j' l
  2. #include<stdio.h>9 l% y& M* N+ U' q5 k
  3. #pragma comment(lib, "ws2_32.lib")8 |, @' {0 q5 g  V* H3 E- I
  4. void main()
    ( G5 S6 }2 o+ E  G
  5. {
    # C  |+ y: X5 N+ d; }
  6.     WSADATA wsaData;4 k2 a; _$ `$ ^8 b& i8 e
  7.     SOCKET sockClient;//客户端Socket7 B! s0 A9 c8 ]: B" O
  8.     SOCKADDR_IN addrServer;//服务端地址
    7 M* ]1 m% `0 s: o0 y
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);5 w9 R- w* W3 J" j
  10.     char message[20] = "HelloSocket!";. c4 y1 y' T- [1 b
  11.     //定义要连接的服务端地址1 O) ~6 F3 H  w: f# o3 T
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    + L4 h; n/ g% k" r
  13.     addrServer.sin_family = AF_INET;
    ' _: W7 M7 d/ O4 P
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    & Q4 f5 ^. w5 ~- J' A" h
  15.     //新建客户端socket
    ( T! u( f& g! b6 h
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);, f9 @. b5 d% t0 Y; o$ M$ G
  17.     int s = 0;
    6 \' ~7 T# S& c2 T' A9 n
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    9 A# p+ D* W8 r8 `+ {

  19. # @2 @" x2 i+ }8 _7 L, R" [3 K) T; i
  20.     while (1){' F/ f9 A- Q8 d2 z. A- ]4 H
  21.         //发送数据
    ( f- ?+ p; ]6 i# m8 x
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    . n9 S* A/ ]2 R, u) S
  23.         printf("to server:");2 c4 L8 \6 y- k  o  `# j$ Z5 [
  24.         scanf("%s", message);
    # e. {$ j& [( @- p7 z  b' W
  25. 3 f/ m' ~' M) Q$ q% W: l5 O
  26.     }: [* B+ T. a% S) o  X9 O
  27.     //关闭socket/ x# ^) V: T  D7 B! p4 w2 h
  28.     closesocket(sockClient);; I  C% a& F" }( z+ c) I
  29.     WSACleanup();
    , w' K6 o- {9 _! e" X; e  O
  30. }
复制代码
求懂的高手来解答一下。4 s6 K; c' ]9 m; ?( c  u
谢谢了!
# L9 a3 a2 }  `" N0 a" ~9 V
) P8 w+ \0 u- C' M" N! Z( l. b5 X. j4 n) _

3 z$ \2 k$ I  l% x6 C7 I: l5 [# ~, {. R3 u" X: u4 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为# V2 i& s! f2 a8 l' P
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-16 15:24 , Processed in 0.056133 second(s), 18 queries .

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