求职简历网 > 知识 >

sockaddr

来源:求职简历网时间:2024-04-01 19:25:09编辑:皮带君

C\C++结构体使用

struct Node{ char fname[20]; struct Node *next;//语法错误 : 缺少“;”(在“*”的前面)};struct AList{ int final_flag; Node *rnext;};Node的定义要再AList前面,因为你AList中用到了Node,或者在AList前面声明下也可以Node中Node的指针需要加struct,改成struct Node *next; 你没有typedef,所以struct Node才是类型,单Node不认识

怎样在C++中使用C的结构体sockaddr

一. 问题描述:1. 类定义:namespace T {class C{private:struct sockaddr_in* mSrc;};2. 编译报错: reference to ‘sockaddr_in’ is ambiguouserror: candidates are: struct sockaddr_incommunicator.h:14: error: struct T::sockaddr_in3. 解释:后面再使用sockaddr_in的时候总认为是在namespace T中声明的,导致歧义。二. 解决办法:将C中的结构体sockaddr_in在类定义之前前置声明,在之后的使用中只需要像下面这样定义:sockaddr_in *mSrc;(不要加struct关键字)当然,还有些细节没有搞清楚,先记着,以后补充。。。


CString如何赋值给DWORD类型(IP地址)???

将字符串分割成四部分,分割字符串可以用CString的Mid函数,以'.'为分割界限

每部分用atoi转成整型,再将四个整形转成DWORD型,第一个数乘以2的24次方+第二个数乘以2的16次方+第三个数乘以2的8次方+第四个数

大致算法是这样,有什么细节不知道的再补充^_^
-------------------------------------------
还是自己写的好,有思考才有进步,你都能用VC了,相信有了算法自己肯定能写出来,加油!


SOCKADDR_IN结构中的sin_family ,sin_addr各是什么具体意思?

sin_family表示协议簇,一般用AF_INET表示TCP/IP协议。
sin_addr是一个联合体,用联合体就可以使用多种方式表示IP地址。一般我们使用其中的最后一种方式,即用无符号长整型数据来表示IP地址。此时,用的是s_nu数据成员,s_un是一个结构体,其中只有一个数据成员,即s_addr。
使用方式:
变量.sin_family=AF_INET;
变量.sin_addr.S_un.S.addr=htonl("IP地址");


Linux下socket编程的sockaddr_in结构体中的__SOCKADDR_COMMON (sin_);是什么意思

__SOCKADDR_COMMON ();是宏定义的意思,括号里面是它的参数,这个宏定义表示的是tcp/ip协议的版本是,ipv4还是ipv6的意思,最后的那个unsigned char sin_zero的大小为什么做减法呢,是为了保证这个结构提到大小和另一个套接字地址的结构体struct sockaddr的大小一致。这么说不知道你能不能不能理解,第一个参数在实际使的时候一般是个常数。


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 copy
#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()
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


socket编程在windows和linux下的区别

SOCKET在原理上应该是一样的,只是不同系统的运行机置有些不同。
Socket 编程 windows到Linux代码移植遇到的问题
1、一些常用函数的移植


2、网络
socket相关程序从windows移植到linux下需要注意的
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,这两者通常转换使用;


上一篇:地狱摇篮

下一篇:没有了

相关推荐

热门头条