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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。4 s6 r9 |0 n1 q- Z2 H
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
1 ^/ f( g9 D$ S4 C/ D; \Talk is cheak , show me the code.
8 N0 p5 q8 W' J9 A服务端代码:% p% K2 m0 n! F% [
  1. #include<stdlib.h>2 r7 D- N! P" o6 j" Y
  2. #include<WinSock2.h>
    ; P1 a7 {3 t; E; p! P) C
  3. #pragma comment(lib,"ws2_32.lib")9 I* \& b* d4 k9 D" |4 X. f
  4. int main(){
    + ?; E, T! v' d+ w" E! S" @
  5.     WSADATA wsd;5 e9 Z- H6 h+ \- A
  6.     SOCKET sockServer;
    / E0 N. v# w7 P' E5 ~0 O' Z8 u
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    0 e2 x! u* r8 D$ H
  8.     SOCKET sockClient;" C1 K2 T0 O; K# x+ E2 w
  9.     SOCKADDR_IN clientaddr;/ {/ _  K. r% \& l6 T
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ' N, \4 d* |7 k
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket1 }4 O7 h. C  }/ q  A

  12. 3 e- E$ ~# I2 G1 I# ?1 @% h

  13. $ r+ o  A6 b/ _5 `
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){; h( s/ `7 u4 `& e0 G2 k/ l
  15.         printf("Socket has been created :%d", sockServer);* D7 H4 W4 a; x8 N" Y
  16.     }$ R: V" M' y9 a
  17.     else{
    ( y3 e6 z1 B+ f4 S" j4 r, h8 c
  18.         printf("Socket create failed.");8 ?4 O; H4 b3 A( ?. Q$ C) Q
  19.         exit(0);
    ; p. f8 M( h6 ~. A
  20.     }% ?( w# m8 {- u. ]
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    3 V& P& W, ]8 J) ]" `
  22.     serveraddr.sin_family = AF_INET;7 W  S: W7 z1 V. K& v
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000& Y0 n# ?: M9 p3 T7 m( }( w
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));  y6 i% I4 U; X
  25.     char recvBuf[100];2 @& n( |  X; e% M
  26.     int len = sizeof(SOCKADDR);
    7 A. ]" f0 L8 d! q, l; q
  27.     listen(sockServer, 5);//5为等待连接数
    ( l/ M( |5 f7 k( y( d# a
  28.     while (1){
    " S/ ]; y, P; P; r1 d7 ]( Y5 R+ Q
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);+ @. H' n" j  \) }. \
  30.         //接收客户端数据( `: X2 D; s8 H
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    # Z9 ]. ?2 J6 ~
  32.         printf("to me:%s\n",recvBuf);
    4 ^/ H* g  n( K) E
  33.         memset(recvBuf, 0, 100);
    0 A, Z+ j+ e' k  E3 p# u
  34.     }0 {  ?: X4 m- R# |9 K: u
  35.     closesocket(sockClient);
    ) P- K! @/ g3 k6 n! ]! `
  36.     system("pause");
    6 Y/ E* w7 S% I0 g+ d* l
  37.     return 0;
    . B6 K# F" s0 w/ n5 x7 K' T4 H
  38. }
复制代码
客户端代码:
9 e6 G2 j$ a4 `! x( v9 s! B" T
  1. #include<winsock2.h>2 |  c# n% ]6 A4 h! ]$ U6 [
  2. #include<stdio.h>
    ) `/ w  v& E8 i, V; M& B" a
  3. #pragma comment(lib, "ws2_32.lib")  Q' H% w; I+ V5 l: F2 z
  4. void main()) E; u) r+ S/ f+ r7 M  F
  5. {* u5 @8 @* i! w0 f, S0 d4 V
  6.     WSADATA wsaData;9 Z5 M. G! m2 S! g" q8 R! s
  7.     SOCKET sockClient;//客户端Socket
    - Z0 R2 f- r1 k% {. {) Z2 w' u
  8.     SOCKADDR_IN addrServer;//服务端地址
    4 d1 \: G7 w% R& ]3 ~" A' S' `- O
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    3 Z) B9 K6 j9 T& C; S
  10.     char message[20] = "HelloSocket!";
    * X7 }2 @; y% d( i0 O7 ?0 U
  11.     //定义要连接的服务端地址8 R! f! X$ I1 O
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    " [% b1 ?) \/ a4 s) z; C
  13.     addrServer.sin_family = AF_INET;
    1 t' w6 C) |3 ~( ?" ]
  14.     addrServer.sin_port = htons(6000);//连接端口6000& ~9 w+ y9 ?8 T' h1 c: V9 \
  15.     //新建客户端socket
    6 x8 A/ F0 }( [# E0 M
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);0 v7 {  b, z- u( G5 R
  17.     int s = 0;; @2 P8 w" |6 t+ p) W; p
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    % p8 V9 N8 t2 s4 q

  19. 4 Z  y! c& ^! D: [" X
  20.     while (1){. L& S8 ?1 L6 a+ j/ u
  21.         //发送数据1 B, h" W+ G! d1 f$ P
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    / e# b5 g; C" s3 x& I
  23.         printf("to server:");
    ! [" y* g6 @' X0 m
  24.         scanf("%s", message);
    : J; w" g+ w' ]$ }
  25. ' _- q5 s* b' d
  26.     }
    9 O$ s3 w2 u. ?$ {( w4 }) T9 y/ b
  27.     //关闭socket
    * z- @4 g% j- r$ ^0 E
  28.     closesocket(sockClient);
    - v& |+ L4 t. t& _5 r2 C
  29.     WSACleanup();
    8 A$ [0 K2 c7 G; ?, q( ~
  30. }
复制代码
求懂的高手来解答一下。( K9 U1 u9 h# P6 M5 G1 @
谢谢了!
1 P# ?: M$ T% F2 F

- T% B, ~9 c" P9 O& n
8 w1 U9 G# }- s, j: g; S
% k5 @0 W& Y- l6 K, s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为% N; \# V( k; Y$ F8 s% @/ v3 i! k
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-1-30 11:37 , Processed in 0.054398 second(s), 19 queries .

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