linux网络编程学习(3)

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值