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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。7 ^0 j3 L9 E/ T) P0 W" P
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。$ {4 v. \# i% `5 H6 J$ W
Talk is cheak , show me the code.
6 q- V1 ]1 K- `" P9 W( o/ [服务端代码:# G4 Y5 c. @3 z. k$ k! h
  1. #include<stdlib.h>
    , u- o" q5 q7 O7 M
  2. #include<WinSock2.h>
    0 l, ]8 `* y! L5 G3 L
  3. #pragma comment(lib,"ws2_32.lib")+ T  X+ s4 q( s1 B/ g
  4. int main(){
    8 h* W$ ?- b. H( f- [& ~$ v
  5.     WSADATA wsd;+ I( g5 Z. {: k' y
  6.     SOCKET sockServer;
    ' o# ]1 m  w7 _) f: c
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号+ {. V7 N+ Y4 L4 ~' E4 l: R1 P
  8.     SOCKET sockClient;/ X0 t% \2 B  n7 K8 I
  9.     SOCKADDR_IN clientaddr;
    8 F! u- G+ d8 b& P. `1 z! y
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口! n- F; j+ I; t" _4 Z" N+ F# E
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket* O1 X8 a* X1 R  w; ^
  12. , B. f7 v6 ^4 h! Z

  13. # f' w+ @- j2 k2 }3 z
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    % @9 i, |+ t7 Z9 ^' q( f9 K
  15.         printf("Socket has been created :%d", sockServer);
      d2 L' q! Y% H( R1 U1 X
  16.     }" w0 N! k$ V+ D! g
  17.     else{
    # t" N+ k# {- N0 ^8 |
  18.         printf("Socket create failed.");
    ; A/ A7 P6 j) J8 d8 q3 [$ ?
  19.         exit(0);+ l% S' v8 l4 @5 ^/ J; w
  20.     }! n) o5 m; j. D. Z; C' X6 r- C
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);0 \# m! G0 K" C3 d0 K' i
  22.     serveraddr.sin_family = AF_INET;& J& A$ g7 q, U. r; O
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    1 P: }0 t6 a' N, W( W7 }8 X
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ) p! _  r9 M4 s' X* R
  25.     char recvBuf[100];
    / f2 k) {$ [- `5 Z: q, p1 u& h
  26.     int len = sizeof(SOCKADDR);
    ; \: m  [! A0 G2 L2 o, ?  ?$ {
  27.     listen(sockServer, 5);//5为等待连接数
    6 S/ P* ?) a1 [+ D
  28.     while (1){, o" `6 m5 h; w2 s9 r4 L; R: G1 x
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    ; A( Z9 H: b' B3 i) P
  30.         //接收客户端数据: S1 L2 O$ A3 x8 m3 n5 t5 \. n$ E
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);" ^9 _5 A3 c: ]7 d$ R% O
  32.         printf("to me:%s\n",recvBuf);' v/ d( l# ]8 P7 p" H3 t+ X8 B
  33.         memset(recvBuf, 0, 100);$ d0 o9 n1 \' G4 y( C6 {2 b' e4 y
  34.     }. [9 p$ p2 H& l, x0 A
  35.     closesocket(sockClient);  ^7 U5 Q( v! n! T, V; c: X1 @
  36.     system("pause");4 j( ^8 y1 S& t3 Q- @  L
  37.     return 0;
    ! f& }+ T/ }0 J, }
  38. }
复制代码
客户端代码:
# Z5 K/ }) V3 d3 h& S$ ~/ s% A2 e
  1. #include<winsock2.h>% O& X; s; w: d
  2. #include<stdio.h>
    " w- J; E+ \  _. u4 j( q0 z
  3. #pragma comment(lib, "ws2_32.lib")+ c% f) m6 P! R. t
  4. void main()$ f+ n$ @: B9 p$ y& g7 `/ [3 y. u
  5. {: E6 q9 b8 Z8 H7 W9 j, N
  6.     WSADATA wsaData;6 `9 @/ z% S8 c4 b9 h5 g! n
  7.     SOCKET sockClient;//客户端Socket( `; v, f. n5 q+ }7 o5 ~* x- D. r
  8.     SOCKADDR_IN addrServer;//服务端地址
    5 c# D$ Y0 z7 Z; y9 I# x! Z
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);+ K) t6 D: V: x9 g
  10.     char message[20] = "HelloSocket!";$ U+ E$ r& p+ `* I
  11.     //定义要连接的服务端地址
    ) t5 |! m, M/ ^6 l2 F
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)- K5 I% s3 o" j: f  w5 d
  13.     addrServer.sin_family = AF_INET;# {$ N9 ^0 K2 a7 B/ @5 N
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    " Y, w+ U! f$ n0 w
  15.     //新建客户端socket% s9 ]; e4 v: B* [* ~
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    # `% s0 d/ {: m% S) m
  17.     int s = 0;; B, \' |4 r+ O5 O) c: \
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    $ L! Q. n1 a% d2 V& m2 C+ y

  19. 0 H/ J2 U5 b) I! G; A: K+ C7 J
  20.     while (1){
    2 q5 O$ d2 t3 |
  21.         //发送数据& R  e7 y( \" X- L# w% p
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    5 X0 e+ v% q$ Q& p! e
  23.         printf("to server:");
    0 p8 `! I& A3 q7 Y% S* E4 d; d, N
  24.         scanf("%s", message);
    * E. J. B; i9 v9 l7 S" p2 ]. T
  25. # Z/ ?* N! ?# }" e
  26.     }. `3 |" u% Y# q0 i
  27.     //关闭socket
    ( t, e# j" k, _: {: }- ?& y
  28.     closesocket(sockClient);% X$ m. n9 C2 e8 U, \! O( W7 R
  29.     WSACleanup();7 h6 {; L; l/ n( `) y4 {  h2 E$ a
  30. }
复制代码
求懂的高手来解答一下。; E( S. a# {" c* c* d8 s$ ^4 _
谢谢了!9 [! Q% H0 ]" w" K
" Z: T$ ?# F( A! s1 u: \/ I* N% s; B( K

4 ~4 U+ [# o1 E: L3 |
! W3 Q4 R* M4 M9 ?/ z- u; L5 z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为) L6 e3 [8 s' q
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-12-22 11:50 , Processed in 0.150778 second(s), 19 queries .

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