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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。6 ~* }$ M) }& s. l3 o7 `
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
2 U" c# ?- W& }9 i6 H8 `  ?/ ~: qTalk is cheak , show me the code./ `/ D2 ?1 `" M
服务端代码:% \) t9 J( r1 _" u7 T
  1. #include<stdlib.h>
    ) x# f: i0 y, K3 x2 F% R  [
  2. #include<WinSock2.h># }, O" I" b1 Y, I: R7 \
  3. #pragma comment(lib,"ws2_32.lib")
    & s5 E" R( q& r' U( y1 {
  4. int main(){) `9 W+ v$ q( j8 j' ^
  5.     WSADATA wsd;0 h" J5 |+ s0 Q/ w- r
  6.     SOCKET sockServer;
    3 y, m: q) f; g- C* O
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    1 ?6 f$ k8 m7 c
  8.     SOCKET sockClient;
    4 L! h! [% X% G% S! n
  9.     SOCKADDR_IN clientaddr;
    ' W9 k2 S  r! j5 U
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    9 c/ h4 R, T" b# c+ y
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    " Y1 v5 M9 O" x4 [5 F

  12. 2 C- @. S- Z  e8 Z6 e* K1 L% b

  13. # m  u8 l/ p% D. ?; a, j5 c  X* P6 l
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    + M; |1 d4 L' E  d% l' J# B
  15.         printf("Socket has been created :%d", sockServer);
    , }, Q; T$ @) K" f% l+ b
  16.     }
    % V5 ~, ?* p5 ~* Y1 P8 k7 o
  17.     else{1 }) F9 H6 ^+ e1 o" n2 q% W8 ]
  18.         printf("Socket create failed.");3 \2 m3 e; d! s1 i/ Q, d
  19.         exit(0);
    / j7 s9 u5 E- f* U; i
  20.     }* k! U/ M1 q2 A2 Y( L0 ?& }
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);: U3 A- ]% L3 v  U5 q
  22.     serveraddr.sin_family = AF_INET;# [" @  o) n! J1 H# j
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    8 }) N8 v" z3 z% c" o" T/ y* a" F
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    0 ^" F) y7 P, `2 m/ G; n) h
  25.     char recvBuf[100];
    . ?+ G8 a8 g3 Y$ p/ X
  26.     int len = sizeof(SOCKADDR);: U6 k' R" R! `, o+ w
  27.     listen(sockServer, 5);//5为等待连接数
    0 s+ h% k* I6 h  j& \
  28.     while (1){" v& J# C* E# I7 }& z4 U: y& P
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);0 ]: X5 I3 u% J5 I
  30.         //接收客户端数据6 N- C: ~* I7 s
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    & T+ M0 R' [. D  S
  32.         printf("to me:%s\n",recvBuf);" E2 W7 B& b8 d! w: F8 X
  33.         memset(recvBuf, 0, 100);8 t( a" N3 L* Z9 D. n& }: d; x
  34.     }% N0 |3 B& S. B- `
  35.     closesocket(sockClient);
    6 p* d4 d. |7 X! W
  36.     system("pause");! L) Y0 q+ x- S9 o8 M  L" t1 m3 I
  37.     return 0;
    2 s, i% n. _" ]& k) a' H
  38. }
复制代码
客户端代码:4 Z+ L! U* `1 v/ Z
  1. #include<winsock2.h>' ]6 m; d( _6 p' h; q+ n
  2. #include<stdio.h>6 y) C. s# L1 g7 V. x4 g  H% f
  3. #pragma comment(lib, "ws2_32.lib")
    8 f0 G+ S) A: \3 n
  4. void main(), P' K. O, o7 O+ O
  5. {4 N  B' r% I6 i- l' S0 ?
  6.     WSADATA wsaData;
    ' c" o1 g& o8 T- a# `; J+ T+ D+ ]
  7.     SOCKET sockClient;//客户端Socket
    " B! h4 m, B$ C) h" b! k7 e# v# D% G
  8.     SOCKADDR_IN addrServer;//服务端地址
    ' K. @+ G7 B/ u, e- c+ x+ k: x
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);% p. Q; X: ?" \6 e& K- l
  10.     char message[20] = "HelloSocket!";
    1 ^( ?3 z4 L: x' \
  11.     //定义要连接的服务端地址$ v6 [+ |6 L( j8 \" V4 u, {+ O" K
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址); R9 C% b. {& W$ T1 b% t
  13.     addrServer.sin_family = AF_INET;
    2 s$ ]3 i4 i/ q
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    7 B4 q( Z9 O- |0 a( }
  15.     //新建客户端socket; |2 E, |6 |3 S) \5 K3 f2 N3 v3 Y
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    4 p/ {. A+ `- m9 c6 H2 u
  17.     int s = 0;
    3 D3 J0 W0 ?. f2 n! I: F
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));- N0 Z- K/ j  A$ {

  19. # L) Y$ F9 x8 i& {+ @* D
  20.     while (1){& M8 X# G% h: R6 g& d5 [; s* T
  21.         //发送数据1 ^* [/ M* Z" v) x5 s
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);  I0 J. f8 H; t1 R1 P2 l
  23.         printf("to server:");+ l) ^4 ~* p! P
  24.         scanf("%s", message);/ r0 Y6 P, y: {2 {: a

  25. 2 R3 F) n# H1 C# F; D7 }
  26.     }
    , D# X. |# U( n. r3 c
  27.     //关闭socket
    7 i/ \3 [5 R) A' {: k  g
  28.     closesocket(sockClient);5 C  T0 y  y- ^
  29.     WSACleanup();
    # N/ b1 {9 H( t! ~1 \+ J
  30. }
复制代码
求懂的高手来解答一下。
# b4 h8 S" [% g& r, b% O5 s: q" {谢谢了!7 i' d. Q$ U( m- z

6 M3 C9 ~$ f$ x( m3 w6 f+ d
6 S+ q6 B) P& Y6 L( R# m
& \' n+ Y( Y  Y. ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

GMT+8, 2026-4-30 21:45 , Processed in 0.067773 second(s), 18 queries .

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