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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。* L( X9 \4 M5 l  L$ o+ O" ^6 n# _
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。( I$ W2 m- Z5 f( b- z
Talk is cheak , show me the code.+ d; o% x( |0 T. e8 h
服务端代码:; F9 z! Z& }, j9 L; j
  1. #include<stdlib.h>: }8 M9 a* X% E& S/ D7 w- f
  2. #include<WinSock2.h>2 R2 r6 P4 x/ b. H4 @
  3. #pragma comment(lib,"ws2_32.lib")' K: L( t% w0 l& o) {
  4. int main(){) {- g% O: @8 p& W
  5.     WSADATA wsd;
    ! e- S6 |8 G  L2 o# I" O
  6.     SOCKET sockServer;
    7 ~; g3 C, P6 H+ q+ f0 v
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    2 L( _% ^* k; k$ }
  8.     SOCKET sockClient;
    ) {6 g) t5 F' A0 `$ y
  9.     SOCKADDR_IN clientaddr;
    7 I, j! U% b; g& m% u
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口: l9 b( Z9 P' F% T. A. W
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    & }; p0 l* w& g/ U4 `- l
  12. " ?! E. r7 w4 v2 r. s5 b. P
  13. / C: c4 E2 \: p- W4 J+ P( N" ^' Q3 m
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){# `5 T% p/ N7 `- `& ?/ V0 ?/ L0 o9 i
  15.         printf("Socket has been created :%d", sockServer);
    " ?) K- g6 C% H! O8 i
  16.     }, x  r/ ^4 [8 Q5 Z' q" {3 c
  17.     else{
    6 b% @; @0 A" \- \- _4 K3 o
  18.         printf("Socket create failed.");
    & r- Z5 O% x4 V6 l/ u2 ?+ [
  19.         exit(0);
    - C/ d! V& ^, k" x4 _5 F. l. q2 F
  20.     }# A% A/ t! A) I4 R
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    8 d+ e' V& q; W/ l: G6 ?0 U) h7 o
  22.     serveraddr.sin_family = AF_INET;. c+ ]8 a& d$ @  D4 T! @1 @* f
  23.     serveraddr.sin_port = htons(6000);//绑定端口60003 D; n+ W' _; D3 e# x3 r, v$ L
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));- Z/ D8 K! M$ C! O# p" G5 a
  25.     char recvBuf[100];, H/ i" s7 Y7 c. `, q
  26.     int len = sizeof(SOCKADDR);
    ; p3 B0 ^4 I1 l: F: a! c
  27.     listen(sockServer, 5);//5为等待连接数
    ; @, `8 N" X) N1 n' q5 |( f5 G4 b$ A
  28.     while (1){. A& h, l3 |5 V! Y0 A. l) W
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);% h2 S* ^% t! Z6 R! F7 O: E
  30.         //接收客户端数据. x) Q8 ?" e0 ?1 Y- v# ^" T0 n
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ! g1 C6 z5 B- |1 N
  32.         printf("to me:%s\n",recvBuf);
    0 w9 O7 e) j4 _& |8 ^' S
  33.         memset(recvBuf, 0, 100);
    " k' T# z- E/ J2 M& W
  34.     }
    7 j: u  X" U( O7 w; Z3 ^4 L
  35.     closesocket(sockClient);
    / w% i3 u  Q9 O% b7 T7 d
  36.     system("pause");
    & h8 P# x- k1 v; g8 }
  37.     return 0;& {5 Q7 J6 W0 B- ^
  38. }
复制代码
客户端代码:
* w+ s" m4 M1 \+ N. V8 a
  1. #include<winsock2.h>
    1 w3 [% r0 r! B% W
  2. #include<stdio.h>
    3 G/ b2 j: c$ |
  3. #pragma comment(lib, "ws2_32.lib")
    & J# j* G% C5 K% v! l
  4. void main()8 u0 t4 z3 E  P7 a. c* H
  5. {# |% \  o7 s3 e8 U
  6.     WSADATA wsaData;& e  n3 v, q' d- C: n
  7.     SOCKET sockClient;//客户端Socket  Z  h2 X' _/ T& I3 T* q
  8.     SOCKADDR_IN addrServer;//服务端地址
    0 T# c, c: {3 b- w+ E' L. J
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ( {# h8 c9 R) M, v* T) N
  10.     char message[20] = "HelloSocket!";( N2 i( |; B0 v2 `. E& P* R
  11.     //定义要连接的服务端地址4 }2 f2 E  z9 r) @1 E; G6 [( m: f  i9 U1 W
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)$ {4 n& I5 U0 |( I, J9 H
  13.     addrServer.sin_family = AF_INET;+ }7 I) S4 {' w9 [7 j% W$ C
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    * i: I4 H4 U* p
  15.     //新建客户端socket
    : ?6 @! a$ q% d/ l# W9 U$ L6 y
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    0 {, y1 V; l% h. C9 }7 l
  17.     int s = 0;4 {5 I3 [! W& e  p
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    & e7 q, L! W; P7 `2 V6 g; c5 l8 k

  19. ) Y% Q+ a; n  d7 ]
  20.     while (1){' p# G. J: Y* y! r+ f& b) I
  21.         //发送数据
    8 ~, L+ ~1 m! P) l/ J
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);$ V( A  u9 h1 O3 N0 y8 r
  23.         printf("to server:");0 g$ Z7 H2 q; e$ M6 M+ L+ [8 T
  24.         scanf("%s", message);
      h; }) x5 ~" M$ \

  25. 7 u2 E0 p$ w; k+ g6 g
  26.     }- v. I4 ?7 u4 S% {
  27.     //关闭socket
    - K1 ~' v. A4 P  f
  28.     closesocket(sockClient);3 }) S* }% r4 O
  29.     WSACleanup();
    . D4 `* q0 a, g
  30. }
复制代码
求懂的高手来解答一下。
) |. i7 Y9 B0 i0 V谢谢了!
, t8 C2 l6 m8 q1 v" |- ^9 n8 f

2 B6 F& Y+ x/ Q1 o" {! k* Y6 K0 v" T% ~' ]; `& ~0 \) B
) W" m8 R2 L9 B  |7 U: R$ ^3 O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为& b; B! R. e, a1 o) O, u
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-4 06:11 , Processed in 0.056301 second(s), 18 queries .

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