TCP的Socket技术之服务器端

XX:那飘过的100~_~{2014/10/02 16:12}

流式套接字(SOCK_STREAM):提供面向连接、可靠的数据传输服务、数据无差错、无重复的发送、且按发送顺序接受。程序的设计思路

服务器端:

流程:WSAStartup()->socket()->bind()->listen()->accept()->send()

(1)创建套接字

(2)将套接字绑定到一个本地地址和端口上

(3)将套接字设为监听模式,准备接受客户端的请求

(4)等待客户端请求的到来,当请求到来后,接受连接请求,返回一个对应与此次连接的套接字

(5)用返回的套接字与客户端进行通讯

(6)返回,等待另一个客户端的连接请求

(7)关闭套接字

// socketTcp.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "tchar.h"

#pragma comment(lib,"wsock32.lib")
#include <stdio.h>
#include <winsock2.h>

#define MAX_SER 10
#define HOST_PATH 256
#define HOSTNAME_SIZE HOST_PATH

char hostName[MAX_PATH]={0};
unsigned short maxService;
unsigned short port;

void Service(LPVOID lpv);
int LoopControl(SOCKET llistenfd,int isMultiTasking);
void initial();
int initSockets(void);											//初始化Windows Socket

int main(int argc, char * argv[])
{
	SOCKET listenFd;
	struct sockaddr_in serverAddr;
	int err;

	initial();
	initSockets();

	//创建socket
	listenFd=socket(PF_INET,SOCK_STREAM,0);
	if(listenFd==INVALID_SOCKET){
		printf("error:out of socket resource \n");
		return 1;
	}

	//bind本机的端口
	serverAddr.sin_family=PF_INET;														//协议类型是INET
	serverAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);									//本机IP
	serverAddr.sin_port=htons(port);													//绑定端口为5054

	err=bind(listenFd,(const struct sockaddr *)&serverAddr,sizeof(serverAddr));
	if(err==INVALID_SOCKET){
		printf("error: unable to bind socket \n");
		return 1;
	}

	//listen 监听端口
	err=listen(listenFd,3);
	if(err==INVALID_SOCKET){
		printf("error: listen socket failed \n");
		return 1;
	}
	printf("listen......");

	LoopControl(listenFd,1);
	printf("server is down \n");
	WSACleanup();

	return 0;
}

void initial()
{
	maxService=3;
	port=5054;
}

 /*
  *	Winsock服务初始化
 */
int initSockets(void)
{
	WSADATA wsaData;
	WORD sockVersion;                                              //typedef unsigned short WORD(16)
	int err;
	sockVersion=MAKEWORD(2,2);
	err=WSAStartup(sockVersion,&wsaData);
	if(err!=0)
	{
		printf("error %d :winsock not avaliable\n",err);
	}
	printf("environemnt invaild success.....\n");
	return 0;
}

/*
** 等待客户端的连接
*/
int LoopControl(SOCKET listenfd,int isMultiTasking){
	SOCKET acceptfd;
	struct sockaddr_in clientAddr;				//客户端地址信息
	int err;
	int serverNum=0;
	HANDLE handles[MAX_SER];
	int nSize;
	nSize=sizeof(clientAddr);
	int myID;

	//存在固定的次数[服务次数小于最大服务次数]
	while(serverNum<maxService)
	{
		acceptfd=accept(listenfd,(struct sockaddr *)&clientAddr,&nSize);			//接收客户连接的准备
		if(acceptfd==INVALID_SOCKET)
		{
			printf("error:accept failed \n");
			return 1;
		}
		printf("accepted connection from client at %s \n",inet_ntoa(clientAddr.sin_addr));
		if(isMultiTasking)
		{
			handles[serverNum]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)Service,(LPVOID)acceptfd,0,(unsigned long *)&myID);
		}
		else
		{
			Service((LPVOID)acceptfd);
		}
		serverNum++;
	}
	if(isMultiTasking)
	{
		err=WaitForMultipleObjects(maxService,handles,TRUE,INFINITE);
		printf("last thread to finish was thread # %d \n",err);
	}
	return 0;
}

/*
*接收客户端的数据,AND向客户端发送数据
*/
void Service(LPVOID lpv){
	SOCKET acceptfd=(SOCKET)lpv;
	const char *msg="message have recived";
	char response[4096];
	memset(response,0,sizeof(response));

	while(acceptfd!=SOCKET_ERROR)
	{
		int result=recv(acceptfd,response,sizeof(response),0);				//接受客户机的数据
		if(result>0)
		{
			printf("from client: %s ",response);
			send(acceptfd,msg,strlen(msg)+1,0);
		}

	}
	closesocket(acceptfd);
}

在浏览器中输入本地ip:5054,查看运行效果。或者使用netstat -a查看端口状态

时间: 2024-12-20 20:12:31

TCP的Socket技术之服务器端的相关文章

socket系列之服务器端socket——ServerSocket类

一般地,Socket可分为TCP套接字和UDP套接字,再进一步,还可以被分为服务器端套接字跟客户端套接字.这节我们先关注TCP套接字的服务器端socket,Java中ServerSocket类与之相对应,这个类主要用于如何在服务器端创建一个套接字服务,建立一个通信终端,被动地等待客户端的连接,一旦有数据进入被监听的端口,这个类将能接收这些数据. ServerSocket类位于java.net包中,它有很多方法,包括创建socket实例.绑定端口,阻塞接收连接等.一般服务器按以下几步进行工作: ①

Java TCP/UDP socket 编程流程总结

最近正好学习了一点用java socket编程的东西.感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下. Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据.就像通过一个文件的file handler就可以都写数据到存储设备上一样.根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的. 对socket的本身组成倒是比较好理解.既然是应用通过socket通信,肯定就有一个服务器端和一个客户端.

Linux配置支持高并发TCP连接(socket最大连接数)

Linux配置支持高并发TCP连接(socket最大连接数)及优化内核参数 2011-08-09 15:20:58|  分类:LNMP&&LAMP|  标签:内核调优  文件系统调优  高并发调优  socket连接  ip_conntract  |字号大中小 订阅 1.修改用户进程可打开文件数限制在 Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个s

第二十天 TCP 及socket通信原理、http协议及web服务、httpd核心配置详解

一.TCP及socket通信原理详解 二.http协议及web服务原理(一) 三.http协议及web服务原理(二) 四.httpd核心配置详解 1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      众所周知:0-1023:管理员才有权限使用,永久地分配给某应用使用(由IANA分配)      注册端口:1024-41951:只有一部分被注册,分配原则上非特别严格.      动态端口或私有端口:41952-65535:由内核分配临时端口,

Java TCP使用Socket进行网络通信(3)

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39322051 本文演示,TCP使用Socket进行网络通信,建立简单的客户端,并使用客户端给服务器发送一条消息,服务端接收到后,将数据打印在控制台上. 1)客户端,发送一个消息给服务端. 2)服务端,接收到客户端的消息,并打印在控制台上. 客户端,代码如下: package tcp.clinet.qdj; import java.io.OutputStream; impo

Java TCP使用Socket进行网络通信(4)之往返发送

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39322613 本文演示,TCP使用Socket进行网络通信,实现客户端与服务器端数据的往返发送. 1)客户端,给服务器发送消息,并将接受到的服务器消息打印在客户端控制台上. 2)服务端,接受客户端消息,并打印在服务器开端控制台上,同时给客户端回复收到消息. 客户端,代码如下: package tcp.client2.qdj; import java.io.InputStr

基于TCP的Socket通信

这里的例程跟前面"基于TCP的Socket"类似,前面是客户端给服务器端发信息,这里是服务器端给客户端发信息 TCP通信模式: TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信两端之间形成网络虚拟链路. 一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信. Java使用Socket对象来代表两端的通信接口,并通过Socket产生I/O流来进行网络通信. SimpleServer.java  服务器程序,不需要建立Android项目,

JAVA与网络开发(TCP:Socket、ServerSocket;UDP:DatagramSocket、DatagramPacket;多线程的C/S通讯、RMI开发概述)

通过TCP建立可靠通讯信道 1)为了对应TCP协议里的客户端和服务器端,Socket包提供了Socket类和ServerSocket类. 2)Socket类构造函数及相关方法 Public Socket(); public Socket(InetAddress address,int port);//本机IP和端口 public Socket(Striing host,int port);//本机IP和端口 public void connect(SocketAddress endpoint);

【转帖】计算机网络协议(三)——UDP、TCP、Socket

计算机网络协议(三)——UDP.TCP.Socket 2019年09月04日 11:09:41 to_be_better_one 阅读数 28794 文章标签: 计算机网络UDPTCPSocket 更多 分类专栏: 计算机网络协议 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ghw15221836342/article/details/100531810 底层网络知识详解:最重要的传输