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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。: c+ }! G# m0 `! Y; Z6 R. P
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
* f# _+ ]0 L  ?5 ?: Q- y: e5 UTalk is cheak , show me the code.
8 ]5 m* `7 ~% f服务端代码:
- N, s  b" f- O
  1. #include<stdlib.h>- t+ y. O; v3 ~% n' O* i. w3 i: A
  2. #include<WinSock2.h>- T8 e+ i$ `- Q0 \0 c
  3. #pragma comment(lib,"ws2_32.lib")
    ; s) s: ^7 J$ f. I1 c9 h
  4. int main(){
    ( s  T3 O# i* l& o7 U
  5.     WSADATA wsd;; M: H( p6 o) r; V
  6.     SOCKET sockServer;- P- Z% V- @: ]
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    - D1 y" E3 E/ m% |4 V
  8.     SOCKET sockClient;3 v. f! P  C- T- L( x
  9.     SOCKADDR_IN clientaddr;) e5 s7 K  Q  N7 ^/ X( j
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    ! B2 e( U9 F5 S9 M. q
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket  u( b% _- V+ A1 K7 _  @# `
  12. 5 F9 U5 S6 ]' u7 K. }' }6 R2 T* g7 {

  13. + k# Z8 x* s( ^
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    & Y- @$ _. u5 p, e0 }! c
  15.         printf("Socket has been created :%d", sockServer);  V2 @; e5 s! G# f
  16.     }* f' ]  k- T. s7 c
  17.     else{7 `3 g: d/ r$ ?: o1 ]
  18.         printf("Socket create failed.");
    2 Y3 @7 d3 f* J3 a& Q4 G# I3 d
  19.         exit(0);
    : p$ p- K$ r/ T8 n
  20.     }  A/ I3 ~4 P8 c. x
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    / M# M8 l, Z' l& E  k: ^! N& N, {
  22.     serveraddr.sin_family = AF_INET;8 ]- O9 S: J" D6 ?5 l9 o
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000, P5 `1 f0 g& c8 ]
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    . c% r4 H# O! d8 k2 A' C
  25.     char recvBuf[100];
      }/ j0 W3 a7 v, G8 a1 I' K
  26.     int len = sizeof(SOCKADDR);0 m6 F: B. Y: ~2 ~2 q) }7 i. ^
  27.     listen(sockServer, 5);//5为等待连接数
    9 v* q$ S, D% U. L& K* Z; H
  28.     while (1){
    " u( ^* o0 Y1 t
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    7 R* z. q& J6 Q6 }% n
  30.         //接收客户端数据; d! n: ?9 Q  e5 d& I9 z9 I  |
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    1 E" Y; M' m3 c4 l) E* {! Y9 R
  32.         printf("to me:%s\n",recvBuf);6 L) [8 X+ w/ o1 b& D, e
  33.         memset(recvBuf, 0, 100);: a$ E( E2 s' E- ?
  34.     }8 g3 V: A' ~* z" Q1 f. C7 C
  35.     closesocket(sockClient);
    , @7 r% I# k! I" o6 ^: A. X: Y
  36.     system("pause");7 ]) [/ d* Y/ ]
  37.     return 0;
    : n; C5 b) v8 }' l+ R* x5 x
  38. }
复制代码
客户端代码:  P8 M6 ~2 _( e  \: }# R3 p3 {; D
  1. #include<winsock2.h>
    + L9 f6 K9 E. b" |3 m& g( i
  2. #include<stdio.h>! `% V, \' q, b9 t3 m4 H! |
  3. #pragma comment(lib, "ws2_32.lib")
    2 N+ l# S# c3 D. q3 a
  4. void main()
    ! W' H# y5 p. b  B- C
  5. {
    + P) E$ r& O9 a7 t9 J0 m
  6.     WSADATA wsaData;
    3 l* @# X( B" }
  7.     SOCKET sockClient;//客户端Socket7 x, Y6 j8 }: y# A7 y
  8.     SOCKADDR_IN addrServer;//服务端地址
    " P- @7 \; A) c! u9 N
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);4 C5 |! S% v  v' i. t$ H
  10.     char message[20] = "HelloSocket!";
    1 p- w* W: i$ K  F$ P. Y1 c
  11.     //定义要连接的服务端地址+ }4 \7 J5 k: r+ Z$ l% f
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)/ N  \% U# o" k( r
  13.     addrServer.sin_family = AF_INET;
    / y8 x1 _2 h" k* S/ d
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    9 N1 M9 K' ?. `3 n, n
  15.     //新建客户端socket0 G! \& G3 O( l0 h9 d% l
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    , N9 h( I* w1 s
  17.     int s = 0;
    ) a1 g- z( E  O7 j4 r
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));; j8 X" t: _& j5 M

  19. % X. J1 h' @* s) n! S) f
  20.     while (1){* s( q& D+ E3 P
  21.         //发送数据
    " e% T4 s+ z! d9 R; h5 b$ q) b
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ; \& R. ]* _4 v5 q2 B3 j. p
  23.         printf("to server:");
    ( T' Z" r9 ?- a( c
  24.         scanf("%s", message);
    5 d. ~" D0 y2 m
  25. 0 D& k+ B4 q% M( Z
  26.     }% R3 E$ n; [2 F. {& J3 A  X0 T; R
  27.     //关闭socket
    & Y2 w0 z8 G/ R* H4 ?$ W, ~7 S. k0 j
  28.     closesocket(sockClient);
    % J2 ?5 I+ f& p4 Q
  29.     WSACleanup();1 d6 k( ~% W; `2 }. N
  30. }
复制代码
求懂的高手来解答一下。0 ^$ ]. Z# A  q1 Q4 o/ w
谢谢了!
5 E) z% Z5 K0 ?: I' M

8 P8 |+ L+ A# u- A; Q8 ?4 f  o6 q+ ~  o- a0 u
' \- A& o6 A8 F- q4 V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为2 @0 }9 Q5 G+ M- n  H6 c% J
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-9-29 06:19 , Processed in 0.119901 second(s), 20 queries .

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