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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

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

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

大家好,感谢你的回复。! f5 e( V) E1 y& J5 v2 g
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。1 b  M! s1 W' ]( K  Y* f- ^$ B
Talk is cheak , show me the code.
$ v7 d0 M# |: |: G' p服务端代码:
( t& e. M2 h6 |9 ]& l1 t. v
  1. #include<stdlib.h>
    ' k8 I6 x# `  o8 c8 T& Q1 a+ d
  2. #include<WinSock2.h>
    8 b5 S) u3 w, L  W* N- k  \: O& q
  3. #pragma comment(lib,"ws2_32.lib")% H6 E- ^) p$ n$ X
  4. int main(){
    ( p' A  x8 z" g2 z( \
  5.     WSADATA wsd;
    ! n5 I9 a3 o. F- j% V( G
  6.     SOCKET sockServer;
    4 P4 [# v1 b' L' ^
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号8 o. i. F# k2 t# p
  8.     SOCKET sockClient;
    9 i! t1 p" B! e" W& f5 m" {
  9.     SOCKADDR_IN clientaddr;
    0 O, o$ |9 J1 O8 s) q: E) n, ^
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    . x6 D$ C- d* k# [1 i0 ?! |
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket# R9 O4 t( _3 a2 B  g* g
  12. 1 C& @/ c# }' h" x) }% x/ x
  13. # g1 h7 V* Z7 g3 n( H7 _
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ! O: P' E3 w( z' }3 k3 ?  k
  15.         printf("Socket has been created :%d", sockServer);9 t  M& ]% ^- o2 M6 x! |0 I
  16.     }
    ) i9 [0 U. ]- @
  17.     else{8 A% t$ v: X& m. r* l
  18.         printf("Socket create failed.");
    1 W5 T- p' }* i: }
  19.         exit(0);
    / S& S5 Q. F8 c3 @2 v
  20.     }
    0 [2 Y6 [  q, N( N; m# ~% Z
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);. ?; u! u+ J/ Y4 y2 l3 k! a/ o
  22.     serveraddr.sin_family = AF_INET;& Y& D' a, Y9 s1 V: \/ g
  23.     serveraddr.sin_port = htons(6000);//绑定端口60003 a7 Z  X3 G# J7 C  D
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));! s8 X: j9 ~+ y/ F
  25.     char recvBuf[100];
    ! Q# m  R! k" C. C! c
  26.     int len = sizeof(SOCKADDR);& D  o. ^2 ^5 ?1 M2 [/ l  P# W
  27.     listen(sockServer, 5);//5为等待连接数
    / J' T- O5 B) `2 F/ j, l
  28.     while (1){
    & @# x* h# F8 y% a
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    & ~1 m: [4 c% ~9 I" a6 m
  30.         //接收客户端数据
    % v. R) X0 \6 t. j" Y+ {& e& K6 ]' k
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);- u; V8 K) e9 O4 b* v7 Y1 |
  32.         printf("to me:%s\n",recvBuf);
    % N0 `+ i/ Y8 }! m7 v
  33.         memset(recvBuf, 0, 100);" }: }; \; I0 I- y" {
  34.     }
    8 N! k6 p+ s& p2 ~2 ^
  35.     closesocket(sockClient);1 B/ M! c3 O1 L, J
  36.     system("pause");) k! \( P3 ?# Z" W3 [+ D
  37.     return 0;3 W5 @$ |$ o, r; O1 q
  38. }
复制代码
客户端代码:& ^/ _8 J( F7 G. f' `2 g1 d( Y' n
  1. #include<winsock2.h>
    # M; u' B) l) w" O- \
  2. #include<stdio.h>; s$ i) t; f; G& c( m3 A5 J
  3. #pragma comment(lib, "ws2_32.lib")2 j( j( U* m& S  ]+ z4 X9 {
  4. void main()
    3 e7 S4 q& B" k; M0 C
  5. {
    " b6 E, C' v) A6 W$ J
  6.     WSADATA wsaData;
    ' H1 l& R! j- F  F/ ^8 S
  7.     SOCKET sockClient;//客户端Socket7 _2 |1 c3 I6 o) h! [9 t* r
  8.     SOCKADDR_IN addrServer;//服务端地址
    ' y7 X' r5 D$ R* R* V2 o3 i
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);3 _; `4 x  C  M3 f. ?
  10.     char message[20] = "HelloSocket!";
    . D9 \6 [. Y$ s. v/ ^
  11.     //定义要连接的服务端地址
    7 h& H& R+ ?. B- V, C- m
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    . |( R  b. G& @. G  |: I4 @
  13.     addrServer.sin_family = AF_INET;% O- }6 j, e, w1 r- ?( p- b7 c
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    : h2 `. c# k9 C4 F
  15.     //新建客户端socket- g# D0 W4 e0 |2 p7 e+ b9 ]4 h# I' y1 X
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    - U: \" i; O- R8 d9 {" v8 D
  17.     int s = 0;
      i9 {" x8 f: R
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    : d0 Z8 w. n* t' l  L1 h

  19. % d7 m% @1 F2 E4 c2 D
  20.     while (1){3 J: J: t/ |8 @) M+ a/ `+ _' l* ?
  21.         //发送数据6 m, E: `, q& u, t1 z
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);- e  A, |: t, i* I3 d9 @! Q
  23.         printf("to server:");" L$ ?' O3 O: o/ V
  24.         scanf("%s", message);
      U% K) z: i8 l( W
  25. 8 f# R2 y+ A0 L' ]$ v
  26.     }: m5 h& m- e/ v5 p# v% q* }
  27.     //关闭socket; k8 Q; f% O( u  `/ t: c/ _  l4 F
  28.     closesocket(sockClient);
    ; X, y+ d- L* X% s- X% W
  29.     WSACleanup();
    # O! G" y3 q1 w" z; L7 @
  30. }
复制代码
求懂的高手来解答一下。$ h, \! h% x) g
谢谢了!8 s! N3 ]5 o) {: K
0 Z: _. T" _4 X9 ~6 t

$ e- E  k  @: l/ P2 ^0 _' Z4 h1 o- i" @) L7 W

最新评论

admin 发表于 2020-5-9 02:33:06
应该用多线程或者多进程,,,过两天给你源代码
admin 发表于 2020-5-9 02:33:20
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
' Q2 J+ g/ L8 q' P( mrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了

GMT+8, 2024-12-22 00:44 , Processed in 0.101259 second(s), 18 queries .

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