导航:首页 > 编程语言 > windows下socket编程

windows下socket编程

发布时间:2022-08-14 19:56:52

‘壹’ 编写TCP协议,用windows socket编程可以吗

当然可以!太可以了!呵呵!什么语言都提供socket.

‘贰’ Windows Socket和linux Socket编程的区别

1)头文件
windows下winsock.h/winsock2.h
linux下sys/socket.h
错误处理:errno.h
其他常用函数的头文件可到命令行下用man指令查询。
2)初始化
windows下需要用WSAStartup
linux下不需要(很方便),直接可以使用
3)关闭socket
windows下closesocket(...)
linux下close(...)
4)类型
windows下SOCKET
在linux下为int类型
5)绑定地址的结构体
名称相同,都是struct sockaddr、struct sockaddr_in,这两者通常转换使用;
在Windows下面名称都是大写,而在Linux下为小写
常用:
Linux下:
sockaddr_in destAddr;
destAdd.sin_family=AF_INET;
destAddr.sin_port=htons(2030);
destAddr.sin_addr.s_addr=inet_addr("192.168.1.1");
Windows下:
SOCKADDR_IN destAddr;
destAddr.sin_addr.S_un.S_addr=inet_addr("192.168.1.1");
但结构体中成员的名称不同
Windows中结构体成员
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
};
下面的一些宏可以使windows下的程序移植到linux下(通过类型的重新定义,使代码具有linux和windows下的移植性)
[cpp] view plain
#ifdef WIN32
typedef int socklen_t;
typedef int ssize_t;
#endif
#ifdef __LINUX__
typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
#define FALSE 0
#define SOCKET_ERROR (-1)
#endif
6)获取错误码
windows下getlasterror()/WSAGetLastError()
linux下errno变量
7)设置非阻塞
windows下ioctlsocket()
linux下fcntl() <fcntl.h>
8)send函数最后一个参数
windows下一般设置为0
linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可 能会导致程序退出。
9)毫秒级时间获取
windows下GetTickCount()
linux下gettimeofday()
10)数据类型的一些转化
通用的:
小端到大端(网络协议使用)的转换:htonl, htons
点分十进制IP和整数之间的相互转换:inet_addr()(该函数将点分十进制转为整数),inet_aton(),inet_ntoa(),inet_pton()(linux下独有 该函数可以实现相互之间的转换)
使用到的头文件不相同,linux下用man命令查询。
另外注意:
linux下使用的套接字为伯克利套接字,因此在select()函数的使用上(第一个参数的设置)也有区别;
windows下为了与伯克利套接字匹配,第一个参数是无所谓,一般可设为0;
int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!
3、多线程
多线程: (win)process.h --〉(linux)pthread.h
_beginthread --> pthread_create
_endthread --> pthread_exit

‘叁’ 什么是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)。套接口可以根据通讯性质分类;这种性质对于用户是可见的。应用程序一般仅在同一类的套接口间通讯。不过只要底层的通讯协议允许,不同类型的套接口间也照样可以通讯。用户目前可以使用两种套接口,即流套接口和数据报套接口。流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。
一个在建立分布式应用时最常用的范例便是客户机/服务器模型。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性。客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地

‘肆’ 在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下用C语言如何实现socket网络编程,需要用到哪些头文件或者库

需要用到的头文件包含:

#include <winsock2.h>

#include <windows.h>

与Linux环境下socket编程相比,windows环境多了一个步骤:启动或者初始化winsock库

Winsock,一种标准API,一种网络编程接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本:

Winsock 1:

Windows CE平台支持。

头文件:WinSock.h

库:wsock32.lib

Winsock 2:

部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数;

头文件:WinSock2.h

库:ws2_32.lib

mswsock.h用于编程扩展,使用时必须链接mswsock.dll

(5)windows下socket编程扩展阅读

winsock库的加载与卸载:

加载:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

加载成功,返回值为0。

WORD wVersionRequested:加载的winsock版本,使用宏MAKEWORD(x, y),x表示高字节,y表示低字节。然而使用时MAKEWORD(2, 2)。高字节与低字节相同~~

LPWSADATA lpWSAData:WSADATA结构的指针,传入参数后,系统帮助我们填充版本信息。有兴趣的可以看看结构体内容,不过基本用不着。

卸载:int WSACleanup(void);比起加载,卸载的函数真是轻松愉快。

‘陆’ socket编程在windows和linux下的区别

你好,比较可以发现:linux下的网络编程与windows下采用底层的API类似,但是也有区别:
区别一:windows下需加上WSAStartup()函数
区别二:关闭socket:linux为close(),windows为closesocket()
windows下采用上层的API,一般有CSocket和CAsynSocket这两种类型的类
这种情况以下socket函数一般的首字母大写。而底层的API不管是windows下的还是linux下的socket函数首字母都是小写的。
当然两者还有其他方面的区别和联系,有待以后慢慢学习~!

‘柒’ windows下的C语言socket编程没有相关socket的头文件怎么办

//服务端代码
#include<winsock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")//这句关键;
void main(){
WORD wV;
WSADATA ws;
int er;
wV=MAKEWORD(1,1);
er=WSAStartup(wV,&ws);
if(er!=0){
return;

}
if(LOBYTE(ws.wVersion)!=1||HIBYTE(ws.wVersion)!=1){
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

char sendBuf[100];
sprintf(sendBuf,"welcome %s to wozhe",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}

//客户端
#include<winsock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")
void main(){
WORD wV;
WSADATA ws;
int er;
wV=MAKEWORD(1,1);
er=WSAStartup(wV,&ws);
if(er!=0){
return;

}
if(LOBYTE(ws.wVersion)!=1||HIBYTE(ws.wVersion)!=1){
WSACleanup();
return;
}

SOCKET sockC=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrS;
addrS.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrS.sin_family=AF_INET;
addrS.sin_port=htons(6000);
connect(sockC,(SOCKADDR*)&addrS,sizeof(SOCKADDR));
char recvB[100];
recv(sockC,recvB,100,0);
printf("%s\n",recvB);
send(sockC,"this is list",strlen("this is list")+1,0);
closesocket(sockC);
WSACleanup();
}

‘捌’ 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);
}
}
}

阅读全文

与windows下socket编程相关的资料

热点内容
解压新奇特视频 浏览:702
图书信息管理系统java 浏览:548
各种直线命令详解 浏览:859
程序员泪奔 浏览:143
素材怎么上传到服务器 浏览:513
android百度离线地图开发 浏览:187
web可视化编程软件 浏览:288
java笔试编程题 浏览:742
win11什么时候可以装安卓 浏览:560
java不写this 浏览:999
云点播电影网php源码 浏览:96
pythonclass使用方法 浏览:226
移动加密软件去哪下载 浏览:294
php弹出alert 浏览:209
吉林文档课件加密费用 浏览:136
传感器pdf下载 浏览:289
随车拍app绑定什么设备 浏览:898
方维团购系统源码 浏览:993
linux反弹shell 浏览:159
打印机接口加密狗还能用吗 浏览:301