socket编程头文件和常用函数

本文介绍了网络编程的基本概念,包括常用的头文件及其功能说明,如socket创建、连接、监听等,并提供了socket编程中的数据结构定义和函数使用示例。

原帖: http://wenku.baidu.com/link?url=hbbWMK26nj8RjR1JMhT4-Zg5DPjLLjTKlpPoBVX0NYD540Y__d4h1vsKYoIYaSEuH4e5Mc5w7cbtcSgQgCrUjhdOjKeqaVRql6cW4oquU6K


sys/types.h

:数据类型定义

 

 

sys/socket.h

:提供

socket

函数及数据结构

 

 

netinet/in.h

:定义数据结构

sockaddr_in 

 

arpa/inet.h

:提供

IP

地址转换函数

 

 

netdb.h

:提供设置及获取域名的函数

 

 

sys/ioctl.h

:提供对

I/O

控制的函数

 

 

sys/poll.h

:提供

socket

等待测试机制的函数

 

 

 

 

其他在网络程序中常见的头文件

 

 

 

unistd.h

:提供通用的文件、目录、程序及进程操作的函数

 

 

errno.h

:提供错误号

errno

的定义,用于错误处理

 

 

fcntl.h

:提供对文件控制的函数

 

 

time.h

:提供有关时间的函数

 

 

crypt.h

:提供使用

DES

加密算法的加密函数

 

 

pwd.h

:提供对

/etc/passwd

文件访问的函数

 

 

shadow.h

:提供对

/etc/shadow

文件访问的函数

 

 

pthread.h

:提供多线程操作的函数

 

 

signal.h

:提供对信号操作的函数

 

 

sys/wait.h

sys/ipc.h

sys/shm.h

:提供进程等待、进程间通讯(

IPC

)及共享内存的函数

 

 

建议:在编写网络程序时,可以直接使用下面头文件代码

 

 

#include <unistd.h> 

#include <sys/types.h> 

#include <sys/socket.h> 

#include <netdb.h> 

#include <stdio.h> 

#include <stdlib.h> 

#include <string.h> 

#include <ctype.h> 

#include <errno.h> 

#include <malloc.h> 

#include <netinet/in.h> 

#include <arpa/inet.h> 

#include <sys/ioctl.h> 

#include <stdarg.h> 

#include <fcntl.h> 

#include <fcntl.h> 

 

 

 

涉及到用户权限及密码验证问题时加入如下语句:

 

#include <shadow.h> 

#include <crypt.h> 

#include <pwd.h> 

需要注意的是,应该在编译时链接加密算法库,即增加编译选项:

 

-lcrypt 

 

 

 

 

 

涉及到文件及时间操作加入如下语句:

 

#include <sys/time.h> 

#include <utime.h> 

#include <time.h> 

#include <sys/stat.h> 

#include <sys/file.h> 

 

 

 

涉及到多进程操作时加入如下语句:

 

#include <sys/wait.h> 

#include <sys/ipc.h> 

#include <sys/shm.h> 

#include <signal.h> 

 

 

 

涉及到多线程操作时加入如下语句:

 

#include <pthread.h> 

#include <sys/poll.h> 

需要注意的是,应该在编译时链接线程库,即增加编译选项:

 

-lthread 

 

socket

编程常用函数

 

struct sockadd { 

unsigned short sa_family; 

char sa_data[14]; 

用于

bind, connect, recvfrom, sendto 

struct sockaddr_in { 

short int sin_family; 

 

//AF_INET 

unsigned short int sin_port; //

网络字节顺序

 

struct in_addr sin_addr; 

 

 

//struct in_addr { unsigned long s_addr; } 

unsigned char sin_zero[8]; 

sample: 

struct sockaddr_in sa; 

sa.sin_family 

 

= AF_INET; 

sa.sin_port = htons(3490); 

sa.sin_addr.s_addr = inet_addr(

132.241.5.10

); 

baero(&(sa.sin_zero),8); 

转换函数:

 

unsigned long inet_addr(const char *cp); 

char* inet_ntoa(strct in_addr in); 

字节顺序转换:

 

htons()

——

-Host to network short 

htonl()

——–

Host to network long 

ntohs()

——

-Network to host short 

ntohl()

——–

Network to host long 

取得本地主机名

 

int gethostname (char *hostname, size_t size); 

取得本地信息

 

int 

 

getsockname(int sockfd, struct sockaddr* addr, int * addrlen); 

例如:

 

struct sockaddr_in sa; 

int len=sizeof(sa); 

getpeername(sockfd, (struct sockaddr*)&sa, &len); 

printf(”local IP:%s”, inet_ntoa(sa.sin_addr.s_addr));

 

获得

DNS

信息

 

struct hostent * gethostbyname(const char* name); 

struct hostent* 

 

gethostbyaddr(const char* addr, int len, int type); 

读取或改变

socker

属性

 

int getsockopt(int sockfd, int level, int name, char* value, int* optlen); 

int setsockopt(…….);

 

对于

socket

编程:

level

一般为

SOL_SOCKET 

常用:

 

SO_RCVTIMEO, SO_SNDTIMEO 

SO_SNDBUF, SO_RCVBUF: buffer size 

.. 

网络连接

 

int socker(int domain, int type, int protocol); 

return -1 means error 

domain : AF_INET 

protocol: 

一般

TCP: sockfd = socket(AF_INET, SOCK_STREAM, 0); 

UDP: sockfd = socket(AF_INET, SOCK_DGRAM, 0); 

绑定端口

 

int bind(int sockfd, struct sockaddr *sa, int addrlen); 

连接网络(

TCP

 

int connect(int sockfd, struct sockaddr *servaddr, int addrlen); 

监听端口(

TCP

 

int listen(int sockfd, int queue_length); 

响应连接请求(

TCP

 

int accept(int sockfd, struct sockaddr *addr, int *addrlen); 

关闭

 

int close(int sockfd); 

int shutdown(int sockfd, int how); 

0

-

禁接收

 

1

—禁发送

 

2

—进收发

 

轮询

 

int 

select(int 

numfds, 

fd_set 

*readfds, 

fd_set 

writefds, 

 

fd_set 

exceptfds, 

struct 

timeval* 

timeout); 

注意

windows

unix

中,函数返回后

fd_set

内容发生了改变,下次使用必须重新赋值。

 

接收和发送:

 

TCP: int send(int s, const void* buf, int len, int flags); 

int recv(….);

 

UDP: int sendto(int s, const void* buf, int len, int flags, const struct sockaddr* to, int tolen); 

int recvfrom(…);

 

基于消息的方式:

 

int sendmsg(int s, const struct msghdr * msg, int flags); 

int recvmsg(…);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值