📄 简单的socket编程例子.txt
字号:
服务器端程序:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MYPORT 4000
#define BACKLOG 10
struct in_addr
{
unsigned long s_addr;
};
//扩展的套接字结构
struct sockaddr_in
{
short int sin_family;
unsigned short int sin_port; //internet port
struct in_addr sin_addr; //internet 地址
unsigned char sin_zero[8];
//sin_zero[8] 是为了是两个结构在内存中具有相同的尺寸把sin_zero 全部设成零值(使用bzero()或memset()函数)
};
//网络字节顺序
int main(int argc, char **argv)
{
int sockfd,new_fd ;
int sin_size;
struct sockaddr_in my_addr ;
struct sockaddr_in their_addr ;
/*
创建套接字连接符
int socket(int domain , int type , int protocol)
type:socket类型
*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create sock\n");
return -1;
}
else
{
/*
int bind (int sockfd , struct sockaddr *my_addr , int addrlen) ;
struct sockaddr的指针,包含地址的信息
*/
my_addr.sin_family = AF_INET ; //主机字节顺序
my_addr.sin_port = htons(MYPORT); /* 网络字节顺序,短整型 */
my_addr.sin_addr.s_addr = inet_addr("10.210.132.38") ;
bzero(&(my_addr.sin_zero), 8); //其它结构部分置0
/*
bind()可以在程序中自动获取你自己的IP 地址和端口
my_addr.sin_port = 0 ;
my_addr.sin_addr.s_addr = INADDR_ANY
//通过设置INADDR_ANY,bind()知道你要它将s_addr 填充为运行这个进程的机器的IP
假如链接的时候你并不需要进行端口交互,使用connetc就可以,其自动寻找一个未使用的端口
*/
if (bind (sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))==-1)
{
printf("bind error\n");
return -1 ;
}
//等待别人连接,进行系统侦听请求,第二个参数是未经过处理的连接请求队列可以容纳的最大数目
listen(sockfd, BACKLOG);
while (1)
{
sin_size = sizeof(struct sockaddr_in);
//第二个参数是远程客户端主机的信息
//这时产生二个套接字,可以对远程套接字进行send和recv操作,sockfd仍然进行侦听
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); //远端套接字
if (new_fd == -1)
{
printf("accept error\n");
}
char *msg = "Hello! World! ";
int len, bytes_sent;
len = strlen(msg);
bytes_sent = send(new_fd, msg, len, 0); //向客户端发送信息
printf("ok\n");
close(new_fd);
}
close(sockfd);
}
/*
有个非常有趣的东西就是假如客户端不请求,服务器端的ok永远不会打印,这就是最普通的阻塞I/O模式: 服务器端在listen的时候,只是在那儿接受数据,它调用accept,但它并没有数据可以接受,accet函数阻塞在那儿.
*/
}
客户端程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MYPORT 4000
#define BACKLOG 10
struct in_addr
{
unsigned long s_addr;
};
struct sockaddr_in
{
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
int main(int argc, char **argv)
{
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("socket error\n");
return -1 ;
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(MYPORT);
server_addr.sin_addr.s_addr= inet_addr("10.210.132.38") ;
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
printf("connect error\n");
return -1;
}
//返回的实际的数据长度
if((nbytes=read(sockfd,buffer,1024))==-1)
{
printf("read error\n");
return -1 ;
}
buffer[nbytes]='\0';
printf("I have received:%s\n",buffer);
close(sockfd);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -