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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
, ]; a, i; A) r' {我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
) h. v5 L0 l( X) S+ N, c/ ?6 NTalk is cheak , show me the code.  ]5 |3 j1 C7 W" m1 R) u: ^
服务端代码:0 |" y" g* n/ b+ x- m
  1. #include<stdlib.h>
    8 w/ v" h" O" h5 @) {9 F3 l
  2. #include<WinSock2.h>
    - S" x* ~& ~4 v, ~
  3. #pragma comment(lib,"ws2_32.lib")
    9 q" [, A* Y( o6 e+ K; ^
  4. int main(){
    ) ?' N: t* V6 e
  5.     WSADATA wsd;* e. v1 W8 \3 w$ {
  6.     SOCKET sockServer;( i# @& M& g7 y: k- z+ Y" Z4 \, a
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    - j* x% k) U: Y  V, T
  8.     SOCKET sockClient;5 M$ ^; @, Z' F3 f9 E
  9.     SOCKADDR_IN clientaddr;2 }" z* `: Z# r; Y$ ?3 P
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    7 A0 q* g- d0 z- i+ _& [4 X- _
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    ; g  k2 Z' k) r9 x
  12. ( N& _+ J$ m6 e  ]
  13.   c# M& t, D5 n! c9 |
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    # ^+ w/ S6 k* t3 J
  15.         printf("Socket has been created :%d", sockServer);
    ( w: x  Q2 Q, a8 h
  16.     }6 O( H- S. a9 }6 Z/ c$ O
  17.     else{
    0 u" `: Z1 B8 C! ^6 U
  18.         printf("Socket create failed.");
    . R) k- z" L" a7 l9 F; e
  19.         exit(0);
    9 |* X0 `& f/ s" @3 w
  20.     }
    3 l1 Z% w) p, M+ U0 B
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ! C, V0 w+ O' a9 k
  22.     serveraddr.sin_family = AF_INET;0 j* l; b* n) X, `; g! `! }, y3 _
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    & N" a5 z" d4 r2 G3 t. {- z6 ]
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    2 Z# B, J1 f2 H; k/ S
  25.     char recvBuf[100];
    # Z; T+ S7 F8 P8 [
  26.     int len = sizeof(SOCKADDR);
    $ `0 o* E  ]6 E. v9 L3 e
  27.     listen(sockServer, 5);//5为等待连接数
    4 K7 @; w' S/ N: z
  28.     while (1){0 S4 _: t! C) r6 n% ~
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    3 x( U; P$ F% R# y, x+ x2 f; }
  30.         //接收客户端数据! S+ C  [8 _9 [, f9 e3 o
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    " \( K) p0 D, Q
  32.         printf("to me:%s\n",recvBuf);" J4 J3 ~! g8 t2 A
  33.         memset(recvBuf, 0, 100);8 [4 s3 J9 f8 z: ^7 B2 [. F  D0 |' K
  34.     }/ r; K# n4 _8 t" Q
  35.     closesocket(sockClient);
    & n; ^5 J1 ~& c- o
  36.     system("pause");
    3 o3 {7 t0 B: R3 N5 @
  37.     return 0;
    0 e5 E4 c- N2 N% Q' }5 a
  38. }
复制代码
客户端代码:+ n3 w; z+ i4 G- u5 d5 W
  1. #include<winsock2.h>6 x( d. i- u- r) }! }
  2. #include<stdio.h>( n7 L$ K! b4 w9 t9 f  \
  3. #pragma comment(lib, "ws2_32.lib")
    1 J- p7 q3 i0 {  A8 z2 E
  4. void main()
    5 w% m5 N( s8 K( A( l, Z
  5. {4 z. n% r3 S) ~3 v; P! S
  6.     WSADATA wsaData;
    ! A2 R1 f/ }. t5 |4 T
  7.     SOCKET sockClient;//客户端Socket
    0 \1 x6 `& ]) y2 b
  8.     SOCKADDR_IN addrServer;//服务端地址
    9 C5 u3 x, e! |+ ^% c
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);5 p9 T5 E! ~0 g( i
  10.     char message[20] = "HelloSocket!";5 w3 ]9 a) D9 W& P' D
  11.     //定义要连接的服务端地址
    . F) a' a2 p3 e+ m" H
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    2 u3 V$ a' B2 O+ l
  13.     addrServer.sin_family = AF_INET;
    ) M) T4 t0 x6 x% x! P; p4 b
  14.     addrServer.sin_port = htons(6000);//连接端口6000' q8 J" i- q3 c. z
  15.     //新建客户端socket7 T7 q4 [# k3 w) g
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);! w* O3 C3 f% H0 \  _- H6 U
  17.     int s = 0;* R7 R& y  z- O3 C$ l
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    , ]& Y% M: M* s* q6 `& z2 D
  19. 8 J# H" S: U4 j3 q
  20.     while (1){: w9 I) Q- z% @+ k( C, l2 ~$ h# [' H
  21.         //发送数据% X2 s/ a* p& T* s1 A
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ! x& d+ ]8 t8 R- f
  23.         printf("to server:");3 |7 Q; F  w1 z' M7 r
  24.         scanf("%s", message);# D5 \0 ^. \5 t0 t5 @3 v
  25. 3 r; \! n; C8 y  }$ z0 L3 T9 H
  26.     }
    ; P$ s9 D" g; A
  27.     //关闭socket) R8 U9 g' O% }$ L/ y
  28.     closesocket(sockClient);0 k4 O5 J+ R; K! a( ]% H
  29.     WSACleanup();8 W8 `) A' @" o8 }! t: m
  30. }
复制代码
求懂的高手来解答一下。
' w) m- J: K* G' ~6 N谢谢了!
0 e5 F. g0 J$ L. `: E
+ B( a0 b" }0 F, ?8 w4 J

7 u7 S* X& g% N) _( f/ n
$ M1 w0 K5 u7 V6 x  @, m/ `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
7 I' Y6 ~& G. k9 Nrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-6-19 21:05 , Processed in 0.052318 second(s), 18 queries .

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