windowssocket编程,windows socket编程 udp
Windows Socket和Linux Socket编程的区别 ZZ
下面大概分几个方面进行罗列:
Linux要包含
[cpp]
#include
sys/socket.h
#include
netinet/in.h
#include
netdb.h
#include
arpa/inet.h
等头文件,而windows下则是包含
[cpp]
#include
winsock.h
。
Linux中socket为整形,Windows中为一个SOCKET。
Linux中关闭socket为close,Windows中为closesocket。
Linux中有变量socklen_t,Windows中直接为int。
因为linux中的socket与普通的fd一样,所以可以在TCP的socket中,发送与接收数据时,直接使用read和write。而windows只能使用recv和send。
设置socet选项,比如设置socket为非阻塞的。Linux下为
[cpp]
flag
=
fcntl
(fd,
F_GETFL);
fcntl
(fd,
F_SETFL,
flag
|
O_NONBLOCK);
,Windows下为
[cpp]
flag
=
1;
ioctlsocket
(fd,
FIONBIO,
(unsigned
long
*)
flag);
。
当非阻塞socket的TCP连接正在进行时,Linux的错误号为EINPROGRESS,Windows的错误号为WSAEWOULDBLOCK。
基于MFC的Windows Socket 编程
服务端程序创建步骤
1.打开通信并告知本地主机,愿意在某一地址和端口上接收客户请求,即创建Socket,将使用bind函数将创建的Socket与本地地址与端口绑定。
2.等待客户请求到达端口,使用listen将Socket设为监听模式,从而等待客户端请求
3.收到请求,处理并发送应答信号,接收到并发服务请求,要激活一个新的进程线程来处理这个客户请求,服务完成后,关闭终止。
使用accept接收客户请求,并根据accept返回的socket进行于客户端通信,此时使用send/receive函数。
4.返回2.
5.关闭服务器,资源。
客户端程序创建步骤
1.打开通信通道,并连接到服务器所在主机的特定端口,即创建socket
2.向服务器发送请求报文,等待并接受应答,继续提出请求,即用connect函数
3.请求结束后关闭通信通道。
在windows下,如何用纯C语言实现socket网络编程?
mfc只是对socket进行了一些封装,大部分人做网络编程都是用的原始的socket,比如如下接口都可以在c下进行调用
1.socket()
2.bind()
3.connect()
4.listen()
5.accept()
6.send() 和recv()
7.sendto() 和recvfrom()
8.close() 和shutdown()
9.getpeername()
10.gethostname()
这些接口是在Winsock2.h中定义的不是在mfc中定义的,你只需要包含Winsock2.h头文件和Ws2_32.lib库就可以了。
windows socket 编程:bind 错误码-1 如何解决?
参考下面:
SOCKET
server_socket;
SOCKADDR_IN
internet_addr;
int
ret,
error,
addr_len;
PROXY_SOCK_PARAM_T
*_param;
HANDLE
hThread;
unsigned
int
thid;
//
创建
socket
server_socket
=
socket(AF_INET,
SOCK_STREAM,
IPPROTO_TCP);
if(server_socket
==
INVALID_SOCKET)
/*
调用
socket
不成功,
返回
INVALID_SOCKET,
调用
WSAGetLastError()
可查看错误代码
*/
{
error
=
WSAGetLastError();
//
TODO:
错误处理
return
0;
}
//
进行
Socket
绑定
internet_addr.sin_family
=
PF_INET;
internet_addr.sin_port
=
htons(PROXY_SERVER_PORT);
internet_addr.sin_addr.s_addr
=
htonl(INADDR_ANY);
ret
=
bind(server_socket,
(SOCKADDR
*)internet_addr,
sizeof(internet_addr));
if(ret
!=
0)
/*
bind
成功返回
0.
否则返回
SOCKET_ERROR,
调用
WSAGetLastError()
可查看错误代码
*/
{
error
=
WSAGetLastError();
closesocket(server_socket);
//
TODO:
错误处理
return
0;
}
//
在
socket
上进行监听
ret
=
listen(server_socket,
128);
/*
listen
成功返回
0.
否则返回
SOCKET_ERROR,
调用
WSAGetLastError()
可查看错误代码
*/
if(ret
!=
0)
{
error
=
WSAGetLastError();
closesocket(server_socket);
//
TODO:
错误处理
return
0;
}
std::cout
"[PROXY-SERVR]
端口
5200
监听启动..."
std::endl;
//
接收来自客户端的请求
for(;;)
{
//
组织传递给新线程的数据结构
_param
=
(PROXY_SOCK_PARAM_T
*)malloc(sizeof(PROXY_SOCK_PARAM_T));
_param-server_socket
=
server_socket;
addr_len
=
sizeof(_param-client_addr);
_param-client_socket
=
accept(
_param-server_socket,
(SOCKADDR
*)(_param-client_addr),
(addr_len));
if(_param-client_socket
==
INVALID_SOCKET)
{
error
=
WSAGetLastError();
//
TODO:
错误处理
}
else
{
//
创建工作线程
hThread
=
(HANDLE)_beginthreadex(NULL,
0,
server_work_thread,
(void
*)_param,
0,
thid);
if(hThread
==
INVALID_HANDLE_VALUE)
{
free(_param);
}
else
{
CloseHandle(hThread);
}
}
}
socket编程在windows和linux下的区别是什么?
1. 头文件
windows下winsock.h或winsock2.h
linux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)
2. 初始化
windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragma comment(lib,"Ws2_32")来告知编译器链接该lib。
linux下不需要
3. 关闭socket
windows下closesocket(...)
linux下close(...)
4. 类型
windows下SOCKET
linux下int
5. 获取错误码
windows下getlasterror()/WSAGetLastError()
linux下,未能成功执行的socket操作会返回-1;如果包含了errno.h,就会设置errno变量
6. 设置非阻塞
windows下ioctlsocket()
linux下fcntl(),需要头文件fcntl.h
7. send函数最后一个参数
windows下一般设置为0
linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可能会导致程序退出
8. 毫秒级时间获取
windows下GetTickCount()
linux下gettimeofday()
什么是winsocket编程接口
Windows下网络编程的规范-Windows
Sockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。
Windows
Sockets规范以U.C.
Berkeley大学BSD
UNIX中流行的Socket接口为范例定义了一套Micosoft
Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley
Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。Windows
Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。此外,在一个特定版本Windows的基础上,Windows
Sockets也定义了一个二进制接口(ABI),以此来保证应用Windows
Sockets
API的应用程序能够在任何网络软件供应商的符合Windows
Sockets协议的实现上工作。因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。遵守这套Windows
Sockets规范的网络软件,我们称之为Windows
Sockets兼容的,而Windows
Sockets兼容实现的提供者,我们称之为Windows
Sockets提供者。一个网络软件供应商必须百分之百地实现Windows
Sockets规范才能做到现Windows
Sockets兼容。任何能够与Windows
Sockets兼容实现协同工作的应用程序就被认为是具有Windows
Sockets接口。我们称这种应用程序为Windows
Sockets应用程序。Windows
Sockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows
Sockets实现都支持流套接口和数据报套接口.应用程序调用Windows
Sockets的API实现相互之间的通讯。Windows
Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。它们之间的关系如图
通信的基础是套接口(Socket),一个套接口是通讯的一端。在这一端上你可以找到与其对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。Windows
Sockets规范支持单一的通讯域,即Internet域。各种进程使用这个域互相之间用Internet协议族来进行通讯(Windows
Sockets
1.1以上的版本支持其他的域,例如Windows
Sockets
2)。套接口可以根据通讯性质分类;这种性质对于用户是可见的。应用程序一般仅在同一类的套接口间通讯。不过只要底层的通讯协议允许,不同类型的套接口间也照样可以通讯。用户目前可以使用两种套接口,即流套接口和数据报套接口。流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。
一个在建立分布式应用时最常用的范例便是客户机/服务器模型。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性。客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地