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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
7 l* J. N3 o3 o) O) D. Q我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。7 M( `9 f9 V' T1 w
Talk is cheak , show me the code.; t/ E! x6 E$ M( f% P" m$ H
服务端代码:; Y+ a3 ?# t0 @) P( r. e$ n2 O
  1. #include<stdlib.h>* c; A7 k' ], s
  2. #include<WinSock2.h>9 f. ^, a+ B) W( j+ d
  3. #pragma comment(lib,"ws2_32.lib")
    3 i# B/ B; T3 B( _: l; ~
  4. int main(){* s# D2 o% _; n0 ]0 n: y; i
  5.     WSADATA wsd;, J. W& ^# [' l( j: T
  6.     SOCKET sockServer;9 U, r) C# W; O' @
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    # B4 U' x9 v  D# z, ]/ |8 S" I
  8.     SOCKET sockClient;$ q0 k) y0 U7 ]/ Y+ V
  9.     SOCKADDR_IN clientaddr;
    - C' Z% X, h; |) q, h; J+ V1 [& L( o. y
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口7 \" U8 O+ J2 o, Q. r
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket) m- W! W) \7 d7 g$ z! G

  12. 1 ~, I# [9 w5 K( m/ l
  13. , l# I% L8 u# e# m* h
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){: n5 i! U; f( ?' y9 q$ o' @
  15.         printf("Socket has been created :%d", sockServer);: V( l& u- y1 D6 b0 `3 p
  16.     }
    + \; c; W+ N- G7 R% V! G- G) {$ f
  17.     else{; J# p! }$ c1 o7 Z3 b9 V# ]/ U
  18.         printf("Socket create failed.");
      F: S' L7 x& g, r* i# ]. c
  19.         exit(0);
    " W( J2 g: ^4 f! x
  20.     }
    9 u2 g, w; Q! ~! p
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    % g( h; z1 b: T4 j! w- S9 Q, \7 Z
  22.     serveraddr.sin_family = AF_INET;
    . v4 e$ Z/ [: e+ G( S0 R/ x/ h
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000% Y& F. L' l; _3 [! b7 p" f
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    # P8 x, d3 N2 u. W: O2 I
  25.     char recvBuf[100];
    9 s( y* S0 x$ X/ H  ~: Y) s2 ]
  26.     int len = sizeof(SOCKADDR);
    3 ?/ _, _9 _* ]5 o2 k2 B. ~
  27.     listen(sockServer, 5);//5为等待连接数
    7 b2 g% T" v+ v0 ]  z
  28.     while (1){% ~7 H* ]! U7 A5 N( _: M
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);: r% z: p& M  O& ]7 s8 I- k
  30.         //接收客户端数据( b2 M8 l5 E$ Y0 _& m
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ; ]; x9 A9 X6 g
  32.         printf("to me:%s\n",recvBuf);( A# q9 Y' g' N; j
  33.         memset(recvBuf, 0, 100);
    3 o, |# L5 d5 ]- R! u9 _
  34.     }8 Q. G7 ^/ ~( z; ^8 M9 k0 h  V: P
  35.     closesocket(sockClient);% E+ u: v4 C& H$ I8 _5 o* _
  36.     system("pause");5 E5 N4 w- x- @+ q  v
  37.     return 0;8 J* c! d5 [) ~4 P+ A  T- D
  38. }
复制代码
客户端代码:7 Q$ D) V& M9 ]
  1. #include<winsock2.h>
    ( K* ]6 b. ?. h5 [6 m( o" f* @
  2. #include<stdio.h>
      ], w& v2 p  z% D0 E
  3. #pragma comment(lib, "ws2_32.lib")
    ( g5 ~: w" V2 r, a9 a- n* }" @
  4. void main(). U2 _9 W( k3 ?$ l  e) |
  5. {
    $ r" _: }- F$ Z4 t' V; i9 P1 {) T
  6.     WSADATA wsaData;
    + M, P  X/ B/ _/ u- ?9 J
  7.     SOCKET sockClient;//客户端Socket! ~+ o9 a2 a: Z6 \" g( p! R) @
  8.     SOCKADDR_IN addrServer;//服务端地址% L1 n& X' W- ~2 P" `
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);& A+ B9 z8 b" R* R; \# M
  10.     char message[20] = "HelloSocket!";, \0 t" P: ~# T2 \! s, G; }
  11.     //定义要连接的服务端地址
    8 r& P: a* q, K
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    9 g% [, H1 |$ X) I, I  z
  13.     addrServer.sin_family = AF_INET;
    8 M" U1 F' T5 t, A3 a% [
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    + S2 ^3 I& O2 W& l8 Y4 n5 k; A1 g3 ]+ d
  15.     //新建客户端socket
    ! R* t+ B3 R6 U/ {% l3 x/ ~3 _" Z/ A
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ' y7 g- N0 ^3 ]' v, w# D" u0 q
  17.     int s = 0;
    3 X+ D" ?3 _  r6 T, d* p* R
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    & u+ f7 k3 `" n8 S! A
  19. 1 p8 p  W( g& u  k, N; f
  20.     while (1){
    % n) T- `: ]4 q1 e
  21.         //发送数据
    7 |  r& Y: Z; B. D! z" }0 O* l+ C& f6 \
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);. F8 F) I& [& u- f7 L- R2 o
  23.         printf("to server:");
    ! ^; M0 H8 e% v! p* r* l9 V# j0 W
  24.         scanf("%s", message);+ a1 h: j5 g, {& m4 G
  25. # u8 {( E& Y. w" I; U  x! _
  26.     }. _+ |( u$ n' P% w6 N
  27.     //关闭socket9 q+ d0 T. B/ m/ z
  28.     closesocket(sockClient);! h# N; ]: u/ E! }8 |2 r5 g# C# R3 L
  29.     WSACleanup();6 D4 ^4 P4 D- o# _" {
  30. }
复制代码
求懂的高手来解答一下。7 z( w& c+ o7 e
谢谢了!* G0 f, H( ?5 p7 I- w6 h2 G, ]
. ?& N# P% U0 \) \  v7 A8 v% j" B

3 A& F) y! x9 `; D
) `0 n6 y# T0 r* [/ 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); 这句改为
: ^% V( O9 w7 s0 urecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-5 19:19 , Processed in 0.115109 second(s), 20 queries .

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