windows socket 客户端怎么判断服务端已关闭
服务器端发起关闭,要让服务器发送RST而不是FIN,
socket客户端 javasocket客户端
这时客户端收到RST后send会直接返回失败(这时就检测出服务器已关闭)而不是阻塞。
如果直接调用closesocket会发送FIN,
需要设置linger使closesocket直接发送RST
代码:
SOCKET
soc_client
=::accept(soc_listen,
(struct
sockaddr
*)&client_addr,
&len);
…struct
linger
so_linger;
so_linger.l_onoff
=1;
so_linger.l_linger
=0;
setsockopt(soc_client,
SOL_SOCKET,
SO_LINGER,
(char
*)&so_linger,
sizeof(so_linger));
socket编程怎么写一个客户端和两个服务端
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。
12
34
56
78
910
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
【服务器端】
#include "stdafx.h"
#include
#include
#include
#define SERVER_PORT 5208 //侦听端口
void main()
{WORD wVersionRequested;
WSADATA wsaData;
int ret, nLeft, length;
SOCKET sListen, sServer; //侦听套接字,连接套接字
struct sockaddr_in saServer, saClient; //地址信息
char *ptr;//用于遍历信息的指针
//WinSock初始化
wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本
ret=WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{printf("WSAStartup() failed!\n");
return;
}//创建Socket,使用TCP协议
sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sListen == INVALID_SOCKET)
{WSACleanup();
printf("socket() faild!\n");
return;
}//构建本地地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序
saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址
//绑定
ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{printf("bind() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //关闭套接字
WSACleanup();
return;
}//侦听连接请求
ret = listen(sListen, 5);
if (ret == SOCKET_ERROR)
{printf("listen() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //关闭套接字
return;
}printf("Waiting for client connecting!\n");
printf("Tips: Ctrl+c to quit!\n");
//阻塞等待接受客户端连接
while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。
{length = sizeof(saClient);
sServer = accept(sListen, (struct sockaddr *)&saClient, &length);
if (sServer == INVALID_SOCKET)
{printf("accept() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //关闭套接字
WSACleanup();
return;
}char receiveMessage[5000];
nLeft = sizeof(receiveMessage);
ptr = (char *)&receiveMessage;
while(nLeft>0)
{//接收数据
ret = recv(sServer, ptr, 5000, 0);
if (ret == SOCKET_ERROR)
{printf("recv() failed!\n");
return;
}if (ret == 0) //客户端已经关闭连接
{printf("Client has closed the connection\n");
break;
}nLeft -= ret;
ptr += ret;
}printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。
}// closesocket(sListen);
// closesocket(sServer);
// WSACleanup();
}【客户端】
#include "stdafx.h"
#include
#include
#include
#define SERVER_PORT 5208 //侦听端口
void main()
{WORD wVersionRequested;
WSADATA wsaData;
int ret;
SOCKET sClient; //连接套接字
struct sockaddr_in saServer; //地址信息
char *ptr;
BOOL fSuccess = TRUE;
//WinSock初始化
wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本
ret = WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{printf("WSAStartup() failed!\n");
return;
}//确认WinSock DLL支持版本2.2
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{WSACleanup();
printf("Invalid WinSock version!\n");
return;
}//创建Socket,使用TCP协议
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{WSACleanup();
printf("socket() failed!\n");
return;
}//构建服务器地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序
saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");
//连接服务器
ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{printf("connect() failed!\n");
closesocket(sClient); //关闭套接字
WSACleanup();
return;
}char sendMessage[]="hello this is client message!";
ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);
if (ret == SOCKET_ERROR)
{printf("send() failed!\n");
}else
printf("client info has been sent!");
closesocket(sClient); //关闭套接字
WSACleanup();
}
SOCKET通信 客户端如何指定端口?
Server端代码
ServerSocket ss = new ServerSocket(8888);
Client端代码
Socket s = new Socket("127.0.0.1", 8888);
客户端的端口号应该看服务器端的端口号是多少,然后在创建Socket对象的时候,将端口号作为参数传递,来创建对象
其他人给你回的是win socket c语言的,java的一样,都封装好了,更简单。但是你要注意,只要经过路由设备,这个端口号就失效了
java socket 客户端是如何向服务器端发送消息的
java socket客户端向服务器端发送消息,可以使用socket类,实例如下: mport java.io.*;
import class EchoClient {
public static void main(String args[]) {
try {
Socket connection =new Socket("127.0.0.1", 5050);
BufferedReader input = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
PrintWriter out = new PrintWriter(connection.getOutputStream(),true );
String info;
info = input.readLine();
System.out.println(info);
boolean done = false;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String sInput;
//out.println("BYE");
while (!done) {
info = input.readLine();
System.out.println(info);
}connection.close();
}catch (SecurityException e) {
System.out.println("SecurityException when connecting Server!");
}catch (IOException e) {
System.out.println("IOException when connecting Server!");
}}
}
基于C/S(即客户端/服务器)模式的通信,有使用面向连接协议(TCP)协议进行的,也可以用面向无连接的UDP协议的。不过就上述程序来看,是TCP Socket了。客户端和服务器通过Socket方式进行通信,Socket可以形象地理解成一个介于服务器和客户端的通道,通道的两端均通过该通道读取和写入Message,程序中的BufferedReader和PrintWriter均为I/O流,只是适用的对象不同而已,BuffedrReader是字符流,需套接在字节流上,用于读取信息,socket.getInputStream()表明读取的对象是Socket中输入的信息,PrintWriter用于向Socke中打印信息。另外,System.out.println()方法用于向标准输出设备输出信息。理解该程序时,需搞明白向哪个对象中读取还是写入信息。稍微抽象一点,不过不是很难,再好好看看书,仔细琢磨琢磨,相信你能明白的!
Socket 客户端重连机制
socket.connect连接不成功时候会抛出异常,try{}catch 捕获异常 继续调用连接函数,递归调用。
当然,如果很长时间都连接不上会占用很多堆栈。 给分吧少年
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。