linux网络编程学习(3)
soket编程
NAME
socket - create an endpoint for communication
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
domain:设置通信使用的ip协议(也就是通信区域),本地、非本地
AF_UNIX, Local communication unix(7)
AF_LOCAL
AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
type:soket类型
SOCK_STREAM Provides sequenced, reliable, two-
(可靠的传输) way, connection-based byte streams.
An out-of-band data transmission
mechanism may be supported.
SOCK_DGRAM Supports datagrams (connectionless,
(不可靠的传输) unreliable messages of a fixed maxi‐
mum length).
protocol: soket传输的协议(udp,tcp)
返回值:成功返回文件的描述符;失败返回-1;
connect函数
NAME
connect - initiate a connection on a socket
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
sokefd:
addr:存放:连接指定服务器的ip,连接服务器的指定应用
addrlen:
返回值:成功返回0;失败返回-1
/******************************client***********************************/
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<errno.h>
#include<string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
int main(void)
{
//创建socket---------------------------------
int sockfd = -1;
//AF_INET:IPv4
//SOCK_STREAM:提供一种序列化,稳定,基于连接的传输方式 tcp
//SOCK_DGRAM:提供一种不稳定,不需要连接的传输方式 udp
//0 :使用参数二里欸写那个对应的默认协议
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
//strerror:将整数类型的错误编号转换成错位信息
printf("errno = %d,error = %s\n",errno,strerror(errno));
}
//连接服务器-------------------------------------
int ret = -1;
struct sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
//将点分十进制表示的ip需要转换为整型,因为s_addr是无符号长整型
//函数:inet_addr()可实现转换:将点分十进制字符串表示的ip转换为整数
/*NAME
inet_aton, inet_addr, inet_network, inet_ntoa,
inet_makeaddr, inet_lnaof, inet_netof - Internet
address manipulation routines
SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//将点分十进制表示的ip需要转换为整型
in_addr_t inet_addr(const char *cp);*/
servAddr.sin_addr.s_addr = inet_addr("192.168.21.213");
//设置端口标识要通信的应用
//可能本地字节序和网络字节序不一样将网络字节转换为本地字节
//需要将本地字节转换为网络字节序
//大端字节序和小端字节序的区分
//转换函数为:
/*NAME
htonl, htons, ntohl, ntohs - convert values between
host and network byte order
SYNOPSIS
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
//h表示本地host to n:network(网络) s:表示短整形
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);*/
servAddr.sin_port = htons(8888);
//bzero():将指定位置的数据全部置为0
bzero(servAddr.sin_zero,8);
//通过sockfd连接指定ip和port的服务器应用
ret = connect(sockfd,(struct sockaddr *)&servAddr,sizeof(servAddr));
if(-1 == ret)
{
perror("connect:");
exit(EXIT_FAILURE);
}
printf("connect server ok\n");
return 0;
}
服务器端程序的编写;
listen()函数
NAME
listen - listen for connections on a socket
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
accept()函数
NAME
accept, accept4 - accept a connection on a socket
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
addr:保存接收到的客户端的信息
返回值:返回一个新的socket;是后续服务器和客户端交互数据的一个锁棒
失败返回-1