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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
$ R5 I3 ]: y  X% @6 H6 N3 A! s6 O; M我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
! ?1 `/ C4 U/ q$ s# w0 Z' NTalk is cheak , show me the code.! N; g! M$ R6 Z8 G& r! Z2 L
服务端代码:- i. J* Q# r+ f$ x" Q& U$ \! D
  1. #include<stdlib.h>" L6 [. r  h: A5 q7 t+ Y' i) ~: Q
  2. #include<WinSock2.h>
    / |/ D* G. g$ W3 g( i" p4 [
  3. #pragma comment(lib,"ws2_32.lib")
    ! r' |2 w* X9 F3 u
  4. int main(){
    9 M8 [$ \) E# }. a0 v7 W, e
  5.     WSADATA wsd;5 B. U* O4 P5 u
  6.     SOCKET sockServer;
      u) m; d4 B! X8 p1 d
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号- z4 ]+ |, c8 m6 ]4 L3 o3 `+ }
  8.     SOCKET sockClient;
    , G( s# ~* K; {2 g9 W8 c# l( k
  9.     SOCKADDR_IN clientaddr;
    8 a, O4 @, b8 u( `1 z% }
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    6 D: p; u; x4 n$ g" i/ W
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket9 m' L5 k% w  D$ ]5 W

  12. ' I! \4 r$ Y. Y- b! c

  13. . y$ G. u1 k6 c$ ^
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    . P: Y8 E- Q/ ?2 M- k
  15.         printf("Socket has been created :%d", sockServer);
    ' t" F4 T  s: f/ d+ N9 z- [( T
  16.     }
    7 X2 j. y1 T* ^+ g0 r2 K' O
  17.     else{" x7 D, @: Y$ A- w/ r/ m  n
  18.         printf("Socket create failed.");7 Y+ F! R1 A. d1 V- X( |6 T
  19.         exit(0);
    7 X! E' _2 Q, _! [$ R  ~# Z
  20.     }+ B) y2 V! Z( N1 X# P
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);: M5 ^- o, U5 V0 ^0 C6 n4 k
  22.     serveraddr.sin_family = AF_INET;8 u& J$ ]9 D  V! Y* j6 Z& Z
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    - B" q; t& y3 V# H) L& G5 t/ f
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    + W$ ]2 Z3 z& _1 W) q$ g3 o3 h
  25.     char recvBuf[100];% c  e9 U3 @7 J
  26.     int len = sizeof(SOCKADDR);$ c# z" J4 A/ O  q; K. U
  27.     listen(sockServer, 5);//5为等待连接数
    $ l( g3 ^8 H" a: F* {- g* x# c
  28.     while (1){
    8 K4 d9 H6 o6 ^8 l
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ( d2 @2 \3 C/ u9 _* H/ N
  30.         //接收客户端数据, a5 i+ B  m4 a7 ~
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);4 _+ R% O$ ?, R2 j0 r
  32.         printf("to me:%s\n",recvBuf);
    7 ~8 p# L" `" k7 V
  33.         memset(recvBuf, 0, 100);/ Y3 G6 H0 N; e
  34.     }
    # `% e  D; i3 P* I# A  p
  35.     closesocket(sockClient);- k6 s5 b9 C6 a9 q2 m
  36.     system("pause");4 F( X# U" p5 @0 ^5 l9 Y' M1 Z
  37.     return 0;
    5 O0 z% H1 s+ m2 y! u% z' J
  38. }
复制代码
客户端代码:4 T8 o5 G; Z( w) c5 `( M
  1. #include<winsock2.h>
    % g$ z; s5 h4 c  y, \$ I: ]3 A
  2. #include<stdio.h>8 b" M. z; [4 z2 i
  3. #pragma comment(lib, "ws2_32.lib")0 }* V; z$ k0 h9 X/ b# G. m
  4. void main()4 }& {3 G1 [, t
  5. {+ E, K8 U1 K. c% ~
  6.     WSADATA wsaData;
    : N5 N# c( y% M# y2 s
  7.     SOCKET sockClient;//客户端Socket
    % v- g4 Y8 L2 {8 ~
  8.     SOCKADDR_IN addrServer;//服务端地址! a; ?5 R" ]9 h5 m( C; g3 e
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);& S- c* |* N# X. {
  10.     char message[20] = "HelloSocket!";9 R. H) w4 ?# x5 K7 Q! P7 U
  11.     //定义要连接的服务端地址3 [/ _( R+ H4 t
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    " p! c7 N/ D7 R* J2 q: l- |* B
  13.     addrServer.sin_family = AF_INET;# _- D- i/ g2 b& [0 F
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    ) G: i" P( B& {# \( n) K
  15.     //新建客户端socket# p% T8 r% ^- g. r
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);: Y: X& o0 x4 ^% {- g' V; G; o
  17.     int s = 0;
    + c. k7 G  ~3 O. D8 S
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
      |% D3 G2 U& D

  19. " }; Y" s+ ?* D: d
  20.     while (1){7 Z4 j4 p  W4 D; b" E" k$ N
  21.         //发送数据! ]. @' {2 b, }6 Z
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);$ N; S: ^  C: U' q1 c
  23.         printf("to server:");. M- Q& L* i) Y, {4 T! {6 J5 x" D% A
  24.         scanf("%s", message);  M/ r4 X& _9 ]) Z
  25. : D* @4 W* ]- L! M/ t4 c5 n
  26.     }
    0 U% o+ ~# S9 }5 O) \. U
  27.     //关闭socket
    * {  ~8 }3 A7 ~1 K  @, @3 x5 l
  28.     closesocket(sockClient);& y( t; t. K. W. b$ V/ z: p! D: S
  29.     WSACleanup();
    3 m/ H* X$ b  @7 d  r- B
  30. }
复制代码
求懂的高手来解答一下。
1 S& o8 c2 r3 j) D谢谢了!/ J$ ~  a5 G. ~% r8 C

& T; R% c) L; y1 s" d- p; e1 I+ \4 ^
3 T7 s2 a+ }0 o, I+ ?% X/ w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为' J! m9 w$ C& W, k6 C) B9 ~  X, k
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-7-19 17:39 , Processed in 0.059032 second(s), 19 queries .

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