socket服务器和客户端的建立步骤
socket服务器和客户端的建立步骤
转自http://blog.csdn.net/wenwen227/archive/2008/12/17/3543497.aspx
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
server.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#define MYPORT 3490
#define BACKLOG 10
main()
{
int sockfd, new_fd;/*listen on sock_fd, new connection on new_fd*/
struct socketaddr_in my_addr;//my address infomation
struct socketaddr_in their_addr;//connector`s address infomation
int sin_size;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { //socket(AF_INET, SOCK_STREAM, 0) 这是创建一个socket
/*AF_INET 表示用IPV4地址族,
SOCK_STREAM 是说是要是用流式套接字
0 是指不指定协议类型,系统自动根据情况指定*/
perror("socket err");
exit(1);
}
my_addr.sin_family = AF_INET; //sin_family表示协议簇,一般用AF_INET表示TCP/IP协议。
my_addr.sin_port = htons(MYPORT);//设置端口号
//my_addr.sin_addr.s_addr = inet_addr("192.168.0.123");
my_addr.sin_addr.s_addr = INADDR_ANY;//auto-fill with local ip
bzero(&(my_addr.sin_zero), 8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind err");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen err");
exit(1);
}
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr_in *)&their_addr, &sin_size)) == -1) {
perror("accept err");
continue;
}
printf("server: got connection from %s\n", inet_ntoa(their_addr.ain_addr));
if (!fork()) {
if (send(new_fd, "Hello ,world!\n", 14, 0) == -1) {
perror("send err");
}
close(new_fd);
exit(0);
}
while(waitpid(-1, NULL, WNOHANG) > 0);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
unlink("server_socket");
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, "server_socket");
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
while(1) {
char ch;
printf("server waiting!\n");
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
read(client_sockfd, &ch, 1);
ch++;
write(client_sockfd, &ch, 1);
close(client_sockfd);
}
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
struct sockaddr_in addr; 定义一个ip地址
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
server.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#define MYPORT 3490
#define BACKLOG 10
main()
{
int sockfd, new_fd;/*listen on sock_fd, new connection on new_fd*/
struct socketaddr_in my_addr;//my address infomation
struct socketaddr_in their_addr;//connector`s address infomation
int sin_size;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { //socket(AF_INET, SOCK_STREAM, 0) 这是创建一个socket
/*AF_INET 表示用IPV4地址族,
SOCK_STREAM 是说是要是用流式套接字
0 是指不指定协议类型,系统自动根据情况指定*/
perror("socket err");
exit(1);
}
my_addr.sin_family = AF_INET; //sin_family表示协议簇,一般用AF_INET表示TCP/IP协议。
my_addr.sin_port = htons(MYPORT);//设置端口号
//my_addr.sin_addr.s_addr = inet_addr("192.168.0.123");
my_addr.sin_addr.s_addr = INADDR_ANY;//auto-fill with local ip
bzero(&(my_addr.sin_zero), 8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind err");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen err");
exit(1);
}
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr_in *)&their_addr, &sin_size)) == -1) {
perror("accept err");
continue;
}
printf("server: got connection from %s\n", inet_ntoa(their_addr.ain_addr));
if (!fork()) {
if (send(new_fd, "Hello ,world!\n", 14, 0) == -1) {
perror("send err");
}
close(new_fd);
exit(0);
}
while(waitpid(-1, NULL, WNOHANG) > 0);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
unlink("server_socket");
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, "server_socket");
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
while(1) {
char ch;
printf("server waiting!\n");
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
read(client_sockfd, &ch, 1);
ch++;
write(client_sockfd, &ch, 1);
close(client_sockfd);
}