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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

发布者: admin | 发布时间: 2020-5-9 02:32| 查看数: 10099| 评论数: 2|帖子模式

大家好,感谢你的回复。8 Y5 f' X+ c/ Q# u8 m, e' U! k. I
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
, d5 Z% a, L" f0 a8 \2 ?; wTalk is cheak , show me the code.
2 l- c5 l' |1 ~6 [! c' Y- Q4 A& ~服务端代码:3 x! B! j, [' e- Z( d
  1. #include<stdlib.h>6 {' U- @/ f& W. p6 |, v
  2. #include<WinSock2.h>
      @) a% Z# L- T# b/ G6 c5 a% t
  3. #pragma comment(lib,"ws2_32.lib")
    * H& L" a& C" f% d8 y' h
  4. int main(){
    5 ~# X; n* H* D! S" x
  5.     WSADATA wsd;1 b, H! Z: B& Q3 D9 _: H% r
  6.     SOCKET sockServer;7 {# ]; N: O( c# d
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号. r! w6 |/ d& y' ?9 H7 R6 G/ i
  8.     SOCKET sockClient;4 r; _7 Z6 h. O! j8 a) i) w+ W
  9.     SOCKADDR_IN clientaddr;
    ' e- [9 d8 W8 Z& _( Y: ^
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口1 i. D! S2 ~6 |
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    1 R7 J5 m# S2 c5 \7 n
  12. 0 m7 t  N4 l' t0 A  `6 ~# _

  13. 4 B& [3 i8 l) S/ O4 M4 a
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){8 a0 j6 S3 A, l' \7 f4 n$ H2 {
  15.         printf("Socket has been created :%d", sockServer);+ v1 [( o  {6 O* S1 U) Y5 H
  16.     }* `. m8 R" |4 p; P
  17.     else{
    - u. g# M0 N, K* }, M5 C: N
  18.         printf("Socket create failed.");
    ! S& P3 J3 N: |# z( B" n
  19.         exit(0);
    * Q  N# n5 K7 ^' U! q
  20.     }1 t) F6 {1 a* h: a9 p0 T8 f  f
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);$ \$ D8 s4 G" n/ ~# r
  22.     serveraddr.sin_family = AF_INET;/ P8 L8 Z4 L: V7 S' r6 p
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    4 w9 y' t) ]! p: W: n. V$ L/ M
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));$ e& ?& u. [5 S3 y* y
  25.     char recvBuf[100];
    , b: Y$ Y2 b+ D% W+ k
  26.     int len = sizeof(SOCKADDR);
    4 J* N, y' k! ^) X
  27.     listen(sockServer, 5);//5为等待连接数
    ) C: ~2 P# Q( V8 J3 A
  28.     while (1){6 b$ S% B8 S. b' `/ X/ `: _5 Z
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    % f1 W+ N0 \1 \, w0 X4 g
  30.         //接收客户端数据
    5 F% Z# _# r4 s" Y. Z3 x6 y
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    / k! F$ Z* p* ^5 G
  32.         printf("to me:%s\n",recvBuf);6 t" v4 r3 b: B# i
  33.         memset(recvBuf, 0, 100);
    6 _5 O6 m; ~( j9 a# P
  34.     }8 y* P3 [8 v: R. Q5 d1 U" i! j
  35.     closesocket(sockClient);
    ; U# ]3 o' x3 N/ q0 O7 E- E2 w
  36.     system("pause");! z& h$ F8 y) P2 u  C
  37.     return 0;
    4 b: c$ q& P( o' I- S4 o6 S
  38. }
复制代码
客户端代码:% U; o. N7 G5 K3 a$ N' Z  i
  1. #include<winsock2.h>+ V) z$ m9 K7 J5 n) e4 }% h% K+ q3 }
  2. #include<stdio.h>
    2 G0 X8 w/ B1 n1 e' `
  3. #pragma comment(lib, "ws2_32.lib")$ w5 M% P/ ], k8 _! y, u+ a9 @
  4. void main()
    / s9 M# e* G  m& l
  5. {- m4 _3 [+ L% b, g2 }6 S: \) l
  6.     WSADATA wsaData;
    $ ?  o$ |( U% x% w
  7.     SOCKET sockClient;//客户端Socket
    4 v3 H9 f8 Y! }1 _9 ?
  8.     SOCKADDR_IN addrServer;//服务端地址
    + ]3 ^" p; }" ?# J8 G5 x. e& Q
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);, ~& F, B. D; p! u! o
  10.     char message[20] = "HelloSocket!";
    * [+ b% B0 E4 C8 b- Y2 w0 z
  11.     //定义要连接的服务端地址
    * @; j8 s& J- r( y9 B
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)! L+ p: R9 R6 |/ h
  13.     addrServer.sin_family = AF_INET;
    2 B) u" w% N* d/ D
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    / t5 B5 ?: ]* t4 x% p9 i
  15.     //新建客户端socket" t' [4 s* n# c+ D5 J
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    / H- j1 E# q2 e' ]+ H% Q$ f3 S* D
  17.     int s = 0;
      v- Z! `) R4 \$ T
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    , D, B2 h( W9 M' n) I6 p: W9 d+ l* {

  19. ' R' i! ]/ L7 a3 h  c1 R# Q/ ?
  20.     while (1){6 O% ]3 O( R, a. ^/ k- i6 A
  21.         //发送数据
    4 ~7 O* K  I7 B. _& N5 `
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);% F  \/ S. [9 r8 x- I2 S8 G
  23.         printf("to server:");
    % c/ c, a  R/ ~/ t; M
  24.         scanf("%s", message);
    4 v! P' S9 [  @

  25. , k9 ]8 v, `6 B, T  |* p/ t" {
  26.     }, Q; d. ?  i  b/ {+ H3 _& U
  27.     //关闭socket
    ; I/ C# ~* B0 [9 V! w1 d. f
  28.     closesocket(sockClient);( z" C5 o8 J' E5 x# m. X
  29.     WSACleanup();; f+ x/ Q% \9 q# r+ ]/ R% m
  30. }
复制代码
求懂的高手来解答一下。  ~" E) L  |+ ~: ^8 g- d
谢谢了!" X4 A0 g+ |  n: d

& U9 Z# v# m8 @' D0 H
( |. [9 z5 Y7 R/ \& J6 c( o. ~8 s' T8 Q% f% p- b

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为. i/ M7 ?5 T$ j  Y6 i3 i
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2024-4-26 06:05 , Processed in 0.127375 second(s), 20 queries .

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