一个socket编程的简单示例

        1.什么是socket(参考:百度百科)

           所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。以J2SDK-1.3为例,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

        2.socket连接过程(参考:百度百科)

        根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
        a.服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
        b.客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
        c.连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求.

        socket连接流程图(以tcp/ip为例):(来源:http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx)

        

           3.简单的示例代码

            a.server端

               

	//socket初始化
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		return 0;
	}

	//创建socket
	int nServerId = socket(AF_INET,SOCK_STREAM,0);
	if(nServerId == -1)
	{
		return 0;
	}

	//调用bind函数将其与本机地址以及一个本地端口号绑定
	sockaddr_in inet_addr;
	inet_addr.sin_family = AF_INET;        //协议类型是INET
	inet_addr.sin_addr.s_addr = INADDR_ANY;//本机IP
	inet_addr.sin_port = htons(8080);      //指定端口号
	if (bind(nServerId, (sockaddr *) & inet_addr, sizeof(inet_addr)) < 0)
	{
		int nErr = WSAGetLastError();
		//关闭socket
		closesocket(nServerId);
		return 0;
	}

	//开始监听,最多允许128个客户端同时链接
	if (listen(nServerId, 128) < 0)
	{
		//关闭socket
		closesocket(nServerId);
		return 0;
	}

	while(1)
	{
		sockaddr_in	inet_addr;
		int len = sizeof(inet_addr);
		// accept 会阻塞进程,直到有客户端连接上来为止
		SOCKET clientSocket = accept(nServerId, (sockaddr *)&inet_addr, &len);
		if (clientSocket == INVALID_SOCKET)
		{
			return 0;
		}
		printf("received a connection from %s %d", inet_ntoa(inet_addr.sin_addr),clientSocket); 
		//发消息给客户端
		send(clientSocket,"you are collected!",4096,0);

		//接受来自客户端的消息
		const int nBufSize = 4096;
		char	buf[nBufSize];
		int nReciveSize = recv(clientSocket, buf, nBufSize, 0);
		if (nReciveSize > 0)
		{
			printf("%s ", buf);
		}
		// 关闭socket
        closesocket(clientSocket);
	}


            b.client端

       
//socket初始化
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		return 0;
	}

	//创建socket
	int nClientId = socket(AF_INET,SOCK_STREAM,0);
	if(nClientId == -1)
	{
		return 0;
	}

	//获取服务器地址
	hostent	*host = gethostbyname("wz");
	if(host==NULL)
	{
		return 0;
	}

	sockaddr_in	inet_addr;
	memset(&inet_addr, 0, sizeof(inet_addr));
	inet_addr.sin_family = AF_INET;	
	memcpy(&inet_addr.sin_addr, host->h_addr, sizeof(inet_addr.sin_addr));
	inet_addr.sin_port = htons(8080); //指定端口
	//同服务端连接
	if(connect(nClientId,(sockaddr*)&inet_addr,sizeof(sockaddr_in))<0)
	{
		closesocket(nClientId);
		return 0;
	}

	const int nBufSize = 4096;
	char	buf[nBufSize];
	//接受从服务端来的消息
	int nReciveSize = recv(nClientId, buf, nBufSize, 0);
	if (nReciveSize <= 0)
	{
		closesocket(nClientId);
		return 0;
	}
	printf("%s,%d ", buf,nClientId);
	//发消息给服务端
	if(send(nClientId,"thanks!",4096,0)<0)
	{
		return 0;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是 Linux 中使用 C 语言编写的简单 socket 编程示例: 服务端代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> void error(const char *msg) { perror(msg); exit(1); } int main(int argc, char *argv[]) { int sockfd, newsockfd, portno; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; if (argc < 2) { fprintf(stderr,"ERROR, no port provided\n"); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); listen(sockfd,5); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("ERROR on accept"); bzero(buffer,256); n = read(newsockfd,buffer,255); if (n < 0) error("ERROR reading from socket"); printf("Here is the message: %s\n",buffer); n = write(newsockfd,"I got your message",18); if (n < 0) error("ERROR writing to socket"); close(newsockfd); close(sockfd); return 0; } ``` 客户端代码: ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> void error(const char *msg) { perror(msg); exit(0); } int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent * ### 回答2: 以下是一个用C语言编写的简单的Linux socket编程示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // close函数 #include <arpa/inet.h> // htons, inet_pton函数 #include <sys/socket.h> // socket, bind, listen, accept, recv, send函数 #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[BUFFER_SIZE] = {0}; char *hello = "Hello from server"; // 创建套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("Socket creation failed"); exit(EXIT_FAILURE); } // 设置套接字选项,允许地址重复使用 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("Setsockopt failed"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定套接字到指定端口 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("Bind failed"); exit(EXIT_FAILURE); } // 监听连接请求 if (listen(server_fd, 3) < 0) { perror("Listen failed"); exit(EXIT_FAILURE); } // 接受连接请求 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("Accept failed"); exit(EXIT_FAILURE); } // 接收客户端数据 valread = recv(new_socket, buffer, BUFFER_SIZE, 0); printf("Received: %s\n", buffer); // 向客户端发送消息 send(new_socket, hello, strlen(hello), 0); printf("Hello message sent\n"); // 关闭套接字 close(new_socket); close(server_fd); return 0; } ``` 该示例中创建了一个TCP服务器,会监听在8080端口上。当有客户端连接后,会接收客户端发送消息,并向客户端发送"Hello from server"消息。最后关闭套接字。 ### 回答3: 在Linux系统中,我们可以使用C语言编写一个基本的Socket编程示例。以下是一个简单的Server-Client示例,包括了服务器端和客户端的代码。 服务器端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[BUFFER_SIZE] = {0}; char *server_response = "Server is connected!\n"; // 创建Socket if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("Socket creation failed"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定Socket到指定端口 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("Binding failed"); exit(EXIT_FAILURE); } // 监听连接 if (listen(server_fd, 3) < 0) { perror("Listening failed"); exit(EXIT_FAILURE); } // 建立连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("Acceptance failed"); exit(EXIT_FAILURE); } // 发送欢迎消息 send(new_socket, server_response, strlen(server_response), 0); printf("Welcome message sent\n"); // 接收客户端消息发送回复 while (1) { memset(buffer, 0, sizeof(buffer)); read(new_socket, buffer, BUFFER_SIZE); printf("Client message: %s\n", buffer); send(new_socket, buffer, BUFFER_SIZE, 0); } return 0; } ``` 客户端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int sock = 0, valread; struct sockaddr_in serv_addr; char *client_message = "Hello from client"; char buffer[BUFFER_SIZE] = {0}; // 创建Socket if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Socket creation failed"); exit(EXIT_FAILURE); } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将IPv4地址从点分十进制转换为网络字节序 if(inet_pton(AF_INET, "127.0.0.1", &(serv_addr.sin_addr))<=0) { perror("Invalid address or address not supported"); exit(EXIT_FAILURE); } // 连接到服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("Connection failed"); exit(EXIT_FAILURE); } // 发送消息 send(sock, client_message, strlen(client_message), 0); printf("Message sent to server\n"); // 接收回复消息 valread = read(sock, buffer, BUFFER_SIZE); printf("Server message: %s\n", buffer); return 0; } ``` 以上代码示例展示了Linux中使用C语言编写Socket通信的基本原理。服务器端使用`socket()`函数创建socket,`bind()`函数将socket绑定到指定的端口,`listen()`函数监听连接请求,并使用`accept()`函数接收来自客户端的连接。客户端使用`socket()`函数创建socket,`connect()`函数连接到服务器,并使用`send()`函数发送消息,`read()`函数接收并打印服务器端回复的消息。 以上示例一个简单的基于TCP协议的Socket通信示例,可以通过编译并在Linux系统上运行进行测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值