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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3211|回复: 2

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

[复制链接]
发表于 2020-5-9 02:32:26 | 显示全部楼层 |阅读模式
大家好,感谢你的回复。
6 s$ W6 n7 W% W6 d1 Q, v我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
& n9 p+ B/ Q* \+ M2 [$ qTalk is cheak , show me the code.3 ?  T( t4 V7 `; _" z; h, @
服务端代码:
' A4 x+ G  L' V+ t( b
  1. #include<stdlib.h>
      \9 p% \$ ]3 V& g( n- L( Q3 ~
  2. #include<WinSock2.h>
    1 S, V" j# P3 ]- d
  3. #pragma comment(lib,"ws2_32.lib")
    6 e3 p5 u% P7 l8 A% z
  4. int main(){
    * ^. K8 ?/ S2 Q* d8 e( A
  5.     WSADATA wsd;
    9 E7 S) d) x' W1 y! S
  6.     SOCKET sockServer;
    7 R0 }3 [/ O/ j/ H' S" w
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号% z, p; ~8 f8 R
  8.     SOCKET sockClient;2 U& ^# Z/ i7 ~' T4 t' e
  9.     SOCKADDR_IN clientaddr;8 ~! h9 a  \# b8 a4 [& T+ A
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口" t- i3 S9 q- S1 ^4 [
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket7 p6 q3 T4 L$ Y* I/ u- Z: j
  12. , C; G0 ~& n4 ]3 k
  13. 3 ?! c( ]; t5 a0 U: |
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    9 F5 U" R1 a3 b8 i4 M: \$ V
  15.         printf("Socket has been created :%d", sockServer);4 |1 ^+ E8 m  [
  16.     }
    - z. O* U- u; [2 D7 t% [
  17.     else{
    $ d( p* a. V. t9 s+ O4 u! }
  18.         printf("Socket create failed.");
    9 G5 m9 }) U  o3 B% B( A
  19.         exit(0);
    + S; z8 h' H7 P' T) w. x5 y* |- ]
  20.     }9 q1 s8 ~+ s7 c# i
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ( ^' G, j; a  ?, u: D4 L# h
  22.     serveraddr.sin_family = AF_INET;
    4 q* }# y. Y& \, \+ V
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    4 L3 Q! S9 }8 @) W4 F
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ! i* y- A& Z  g' E
  25.     char recvBuf[100];
      i2 r. k- H2 {. o3 K
  26.     int len = sizeof(SOCKADDR);
    2 X- H& v9 D: E
  27.     listen(sockServer, 5);//5为等待连接数* M' ~. R7 K8 c4 Y7 V% I! x) L
  28.     while (1){( e, }$ n9 j7 D
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    8 k/ r3 `! _* N- Y# ^
  30.         //接收客户端数据$ ?' h: \( A" s5 E* k, Y
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    2 {* u! n- s+ v; e
  32.         printf("to me:%s\n",recvBuf);
    + |3 ~+ @; J+ M. H
  33.         memset(recvBuf, 0, 100);
    : m; U9 M6 `! K' w: U0 Q/ t0 \4 }
  34.     }
    ) x5 z/ {6 A6 N4 q9 o1 L
  35.     closesocket(sockClient);
    ( ?) O& G! q- K2 Z( ^4 E. n
  36.     system("pause");
    : }. |/ q7 c, u, j
  37.     return 0;
    / H, l% l2 O. y) y* z/ g
  38. }
复制代码
客户端代码:" |9 ~' d1 E9 ?% ^4 U
  1. #include<winsock2.h>* F# q0 j- p0 P" i
  2. #include<stdio.h>
    5 D& C3 u6 X7 c$ j
  3. #pragma comment(lib, "ws2_32.lib")3 I7 L" m4 V4 l" m* c3 b4 @
  4. void main()3 F2 B7 \8 ^; A* p) {# d( p
  5. {. }' p# m6 Y9 p+ S# `
  6.     WSADATA wsaData;* {% T6 ?2 Y; u
  7.     SOCKET sockClient;//客户端Socket- k+ H7 w, ^5 l
  8.     SOCKADDR_IN addrServer;//服务端地址0 L- E* _/ v" |7 M) G! h
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);3 G+ v2 ~; E0 [- U: r* M
  10.     char message[20] = "HelloSocket!";$ d  z, U# W- {3 ~. b; z
  11.     //定义要连接的服务端地址7 [7 C/ ?1 \7 T7 K1 z/ n( x  M
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    1 e9 f/ s* h3 g' L. Z- _
  13.     addrServer.sin_family = AF_INET;1 Y& B* P+ u" b$ [3 F! L7 H, P
  14.     addrServer.sin_port = htons(6000);//连接端口6000# Y% d7 s7 v3 Q2 ^0 T; v, ~# y
  15.     //新建客户端socket
    ; P4 m6 u! Z+ c4 J* ^! d
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);! t, l* L0 o. T" V
  17.     int s = 0;
    : j3 F/ M& o0 }  s
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    - P1 o1 e# U* W, k6 t$ I

  19. 3 f  u: C' f. G8 y. H
  20.     while (1){
    ; `. T) t% T% p9 x  D  s$ O
  21.         //发送数据; C4 y. C/ d3 t8 X8 Z
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    9 Y7 q2 f/ X; U6 v, c7 V9 G+ n0 \9 ]
  23.         printf("to server:");: }, i- q: D0 m( `) d' |  f3 A1 ]
  24.         scanf("%s", message);
    . n. V, X! k/ r# b

  25. $ E3 \; S1 ?! {: Y
  26.     }  a' f; V. P8 V5 y* u
  27.     //关闭socket
    2 a' [9 U6 {/ \; I. l* g& {4 D* K
  28.     closesocket(sockClient);
    * n, f# O! m9 `' R) I  }& M# P
  29.     WSACleanup();) j0 M2 |& A" P/ }: p. [6 B" B
  30. }
复制代码
求懂的高手来解答一下。4 m% }( Z! f6 x9 h
谢谢了!' u" w3 f5 Z$ ^6 b& s5 r  ?4 e* F
$ y; j2 \; r% N/ z$ y7 w
& ?" B* K2 T& N$ m% d9 g/ X

: P; ~) `9 a  Y; @  a
 楼主| 发表于 2020-5-9 02:33:06 | 显示全部楼层
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-9 02:33:20 | 显示全部楼层
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
) A' T! k* y. f$ @7 [' c! R7 Frecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2021-9-17 16:15 , Processed in 0.117260 second(s), 21 queries .

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