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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。, W1 ?* |. h2 V0 V1 g
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 }2 c/ |; d; `Talk is cheak , show me the code.0 H1 [0 w* u5 F: ]0 F6 v7 @
服务端代码:5 m0 B% ~7 R9 V+ o) V5 [4 Z2 m$ }
  1. #include<stdlib.h>/ P) k) o( Q9 b
  2. #include<WinSock2.h>( I! [, |6 h  M! x; _( J
  3. #pragma comment(lib,"ws2_32.lib")
    ( m% b4 C+ S0 X$ V- x
  4. int main(){1 N$ s1 S+ Q) S7 ?) @) {( i
  5.     WSADATA wsd;/ K4 c0 d" u4 |5 h2 a
  6.     SOCKET sockServer;
    ( P+ N  c2 z% q9 g3 }
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    5 \* V/ }! P, ~# r+ V; T/ v. r0 S1 J2 R" s
  8.     SOCKET sockClient;
    & z3 B4 s) R! h
  9.     SOCKADDR_IN clientaddr;
    8 x- f! M8 v* O- S0 A, Y- J
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    9 h3 e2 i) V% p
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    6 Y1 a% X8 I4 E3 A9 S

  12. 5 t# K: h* y3 W0 |- u
  13.   I0 p& n; [" ~
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ) V& e5 o  w7 A" J
  15.         printf("Socket has been created :%d", sockServer);( N: @- s/ l6 m( p" H0 R
  16.     }
    9 X: O% w$ E) J- N$ {0 `3 u
  17.     else{
    7 z- [$ `" ~! B$ k* U6 u* R( x/ p
  18.         printf("Socket create failed.");
    * ?6 O9 Q; {5 y% l8 `8 X
  19.         exit(0);
    ' R6 d( s2 ?1 V7 E: g5 U
  20.     }# t. L2 G: g# L2 B) t' |7 m- S
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    : A/ j- @" m. C' d0 F
  22.     serveraddr.sin_family = AF_INET;
    7 H, c) I- h% ^$ o8 n
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000$ s3 D4 a1 {) K! U! Q- g
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    # u$ }+ q0 n3 `
  25.     char recvBuf[100];
    5 L; |/ y9 [) L- ]; N2 E
  26.     int len = sizeof(SOCKADDR);
    ; Y5 Q' D. E/ [7 t6 {/ ^: I6 L6 s
  27.     listen(sockServer, 5);//5为等待连接数+ ~" N- q- @* D' [& T$ Q
  28.     while (1){8 _1 G% {% P$ L+ B
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);, t7 F& O$ F) ?% N: h3 |8 n
  30.         //接收客户端数据* {5 G5 A; }# q% |0 k
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    & `# R+ S* N  ~; K/ [
  32.         printf("to me:%s\n",recvBuf);
      n+ x' C& W7 j/ O: U; w: H
  33.         memset(recvBuf, 0, 100);* ?$ }3 d3 m* A: c9 [, x" @
  34.     }
    ' P8 y) o8 v$ P4 o' E
  35.     closesocket(sockClient);
    % p* A# ?5 w' g' q2 B9 w& S, x
  36.     system("pause");9 `8 W: X9 s3 c3 Y( C
  37.     return 0;
    " y9 b0 \' O' ^! m* Q( j
  38. }
复制代码
客户端代码:
6 m3 |! g4 |& O
  1. #include<winsock2.h>+ h" V7 L& ]3 ]/ U" Z- m; t
  2. #include<stdio.h>7 g$ [+ `$ E' C5 }2 o$ M( f& }
  3. #pragma comment(lib, "ws2_32.lib")! |3 G" o0 Z0 C; P) `
  4. void main()
    9 n' Q- V. o, {2 ~+ t
  5. {  X. J7 H- S( f( ^. ~- [* R+ q
  6.     WSADATA wsaData;# p- O' j% p! L/ i% z" M% `7 R
  7.     SOCKET sockClient;//客户端Socket* i1 h( k0 F" p" c' K" b
  8.     SOCKADDR_IN addrServer;//服务端地址. c* v" l, E1 |/ _% b: e, {  c/ x( g
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);) ?. F1 h* z  z! ?0 v9 w
  10.     char message[20] = "HelloSocket!";1 T3 J: ]+ j& r8 _+ N$ e% C
  11.     //定义要连接的服务端地址
    ; L, j# F  d* b7 W- b: L' Y
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    , {. w+ P- `+ E% w( q
  13.     addrServer.sin_family = AF_INET;
    & L; o" m# a, d% {
  14.     addrServer.sin_port = htons(6000);//连接端口6000. m' R, S* o: q0 n2 D6 N
  15.     //新建客户端socket
    3 H- l( v! M  N# n: C2 V  j8 t
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);& U' X! T6 n8 U' K2 Z+ N/ W0 ~
  17.     int s = 0;
    . s+ T1 P6 M( g: f3 c: I
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));9 z( \  R) \% O2 F
  19. 7 t5 {- w' H8 E  Q
  20.     while (1){
    8 y3 x+ M( T, f& [& T5 I
  21.         //发送数据
    & P+ ^1 `6 v+ U
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);* |# @1 I, H$ \- s5 [0 _% |
  23.         printf("to server:");; ?1 ?( j+ R* X
  24.         scanf("%s", message);6 e" R$ l3 G4 H8 o
  25. 5 J9 k% [* V6 ?3 x/ ^1 E
  26.     }) `! a) Q. e, t! z# ?7 `3 L9 o& J5 X5 d
  27.     //关闭socket
    + l' m: y* Q1 H% i4 [. F9 z
  28.     closesocket(sockClient);, {1 y0 N4 Q6 M- i- Q
  29.     WSACleanup();6 p( q3 Q+ k; ]2 M% S$ N0 d( T
  30. }
复制代码
求懂的高手来解答一下。5 ]3 J. a& G, r" M
谢谢了!
; M; Y+ u  Q) M2 s% N* c

. A5 v7 A2 V. ~. r, W' L* R5 J( H6 d
' N+ S* ]# @0 ]' _1 K- b4 p5 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
# |% _/ }; i! g3 z- [recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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