socket通信原理(socket通信原理中服务器端只有唯一的IP和端口吗?)

      最后更新:2023-03-26 18:54:50 手机定位技术交流文章

      c#应用开发工程师得学什么专业 (专科学校)

      职位描述 任职要求:1.精通C#语言,2年以上Winform方向软件项目开发经验,有WPF开发经验优先考虑,1年以上开发管理经验;2.熟练掌握.NET分层开发、MVC开发思想及组件式开发模式,有使用MVC实际开发经验;3.熟悉SqlServer、Oracle、Mysql等数据库编程,熟练使用视图、索引、存储过程、触发器等技术;4.熟练应用LINQ to SQL等技术,有实际应用过ORM的经验; 5.熟悉.net多线程的开发、设计模式、缓存技术、Socket通信原理;
      感兴趣的话就可以学习的,这个方面主要是学C语言/C++/JAVA、SQL/ORACLE/DB2等等。
      c#应用开发工程师得学什么专业 (专科学校)

      如何实现基于ace库的tcp/udp通信的封装

      类名:TSocket 文件包含:TSocket.cpp、TSocket.h使用方法:1、在对话框头文件包含TSocket.h#include "TSocket.h"2、定义变量TSocket m_TSocket;3、TSocket类函数功能介绍:LoadSocket():加载SOCKET库CreateSocketSer(TRUE):创建SOCKET,TRUE为TCP,FALSE为UDPBingSocket():绑定IP和端口,有默认值Start(precvPar):precvPar为一个RECVPARAM结构体指针SendData(strSend):发送数据函数4、服务端处理接收到的数据(消息映射、路由)afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);ON_MESSAGE(WM_RECVDATA,OnRecvData)void CXXXDlg::OnRecvData( WPARAM wParam,LPARAM lParam ){CString strrecv = (char*)lParam;//得到消息内容}5、稳定性不能保证,仅供参考socket通信原理。。。。。。****************************************TSocket.h*****************************************// TSocket.h: interface for the TSocket class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_TSOCKET_H__ECFF7A02_DCAF_455D_97C3_0C1D465D977B__INCLUDED_)#define AFX_TSOCKET_H__ECFF7A02_DCAF_455D_97C3_0C1D465D977B__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include#pragma comment(lib,"ws2_32.lib")#define WM_RECVDATA WM_USER+500 //定义接收到数据发出的消息号#define MAX_MSG_LEN 1500 //最大的消息长度(MTU)#define DEFAULTPORT 1991 //定义默认服务端口class TSocket;struct RECVPARAM{TSocket* psocket;//指定创建的socketHWND hwnd;//指定需要处理接收消息的窗口句柄};class TSocket{public:TSocket();virtual ~TSocket();public://加载Winsock库BOOL LoadSocket();BOOL CreateSocketSer(BOOL bMode);//创建socket用于服务器端SOCKET CreateSocket(BOOL bMode);//创建socket用于客户端BOOL BingSocket(u_long ulIP=0,u_short usPort=DEFAULTPORT);//绑定端口、IP(默认所有IP)BOOL Start(RECVPARAM* recvPar);BOOL Stop();SOCKET GetSocket();//得到当前socketCString m_strData;//发出去的数据BOOL m_bIsRun; //是否继续运行u_long m_ulLocalIP;//本地IPu_short m_usLocalPort;//本地端口u_long m_ulRemoteIP;//远程IPu_short m_usRemotePort;//远程端口//发送数据DWORD SendData(CString strSend);//TCP发送线程static DWORD WINAPI TcpSendProc(LPVOID lpParameter);//UDP发送线程static DWORD WINAPI UdpSendProc(LPVOID lpParameter);//TCP发送数据DWORD TcpSend();//UDP发送数据DWORD UdpSend();private:BOOL m_bMode; //通信方式 1--TCP 0--UDPSOCKET m_socket;//套接字HANDLE m_hRecv; //接收线程的句柄//TCP接收线程static DWORD WINAPI TcpRecvProc(LPVOID lpParameter);//UDP接收线程static DWORD WINAPI UdpRecvProc(LPVOID lpParameter);};#endif // !defined(AFX_TSOCKET_H__ECFF7A02_DCAF_455D_97C3_0C1D465D977B__INCLUDED_)****************************************TSocket.h*********************************************************************************TSocket.cpp*****************************************// TSocket.cpp: implementation of the TSocket class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TSocket.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TSocket::TSocket(){m_bMode = FALSE;//UDPm_ulRemoteIP = 0;m_ulLocalIP = 0;}TSocket::~TSocket(){//释放Winsock库WSACleanup();}BOOL TSocket::LoadSocket(){//加载Winsock库WSADATA wsa;if (WSAStartup(MAKEWORD(1,1),&wsa) != 0){return FALSE; //加载失败}return TRUE;}BOOL TSocket::CreateSocketSer(BOOL bMode){m_bMode = bMode;//创建SOCKETif (m_bMode){m_socket = socket(AF_INET,SOCK_STREAM,0);//TCP流式}else{m_socket = socket(AF_INET,SOCK_DGRAM,0);//UDP方式}return TRUE;}SOCKET TSocket::CreateSocket( BOOL bMode ){m_bMode = bMode;SOCKET socketCr;//创建SOCKETif (m_bMode){socketCr = socket(AF_INET,SOCK_STREAM,0);//TCP方式}else{socketCr = socket(AF_INET,SOCK_DGRAM,0);//UDP方式}return socketCr;}BOOL TSocket::BingSocket(u_long ulIP,u_short usPort){//配置监听地址、绑定监听端口SOCKADDR_IN Sersock;//用于服务器的监听SOCKETZeroMemory(&Sersock,sizeof(Sersock));if(ulIP==0){Sersock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);}else{Sersock.sin_addr.S_un.S_addr = htonl(ulIP);//IP}Sersock.sin_family = AF_INET;Sersock.sin_port = htons(usPort);//端口号int nbind = bind(m_socket,(SOCKADDR *)&Sersock,sizeof(SOCKADDR));if (SOCKET_ERROR==nbind){closesocket(m_socket);return FALSE;}return TRUE;}DWORD WINAPI TSocket::TcpRecvProc( LPVOID lpParameter ){TSocket* psocket = ((RECVPARAM *)lpParameter)->psocket;HWND hwnd = ((RECVPARAM *)lpParameter)->hwnd;delete lpParameter;//释放内存listen(psocket->m_socket,5);SOCKADDR_IN addrClient;int len=sizeof(SOCKADDR);char szrecvbuf[MAX_MSG_LEN];char szsendBuf[50];ZeroMemory(szrecvbuf,sizeof(szrecvbuf));ZeroMemory(szsendBuf,sizeof(szsendBuf));SOCKET sockSer;while(psocket->m_bIsRun){//用accept函数接收客户方的连接sockSer=accept(psocket->m_socket,(SOCKADDR*)&addrClient,&len);if (INVALID_SOCKET==sockSer)continue;sprintf(szsendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));//在客户方套接字clientSocket上使用send发送数据send(sockSer,szsendBuf,strlen(szsendBuf)+1,0);//接收的数据recv(sockSer,szrecvbuf,50,0);psocket->m_strData.Format(_T("IP:%s,端口:%d 说:%s"),inet_ntoa(addrClient.sin_addr),addrClient.sin_port,szrecvbuf);::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)psocket->m_strData.GetBuffer(0));//关闭本次连接closesocket(sockSer);//休息100SSleep(100);}//关闭socketclosesocket(psocket->m_socket);return 0;}DWORD WINAPI TSocket::UdpRecvProc( LPVOID lpParameter ){TSocket* psocket = ((RECVPARAM *)lpParameter)->psocket;HWND hwnd = ((RECVPARAM *)lpParameter)->hwnd;delete lpParameter;//释放内存SOCKADDR_IN sockRecv;int nlen = sizeof(SOCKADDR);char szrecvbuf[MAX_MSG_LEN];ZeroMemory(szrecvbuf,sizeof(szrecvbuf));int nrecv;while (psocket->m_bIsRun){nrecv=recvfrom(psocket->m_socket,szrecvbuf,sizeof(szrecvbuf),0,(SOCKADDR *)&sockRecv,&nlen);if (SOCKET_ERROR == nrecv)break;psocket->m_strData.Format(_T("IP:%s,端口:%d 说:%s"),inet_ntoa(sockRecv.sin_addr),sockRecv.sin_port,szrecvbuf);::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)psocket->m_strData.GetBuffer(0));//休息100SSleep(1000);}//关闭socketclosesocket(psocket->m_socket);CloseHandle(psocket->m_hRecv);return 0;}BOOL TSocket::Start( RECVPARAM* recvPar ){m_bIsRun = TRUE;//创建接收消息的线程if (m_bMode){m_hRecv = CreateThread(NULL,0,TcpRecvProc,(LPVOID)recvPar,0,NULL);}else{m_hRecv = CreateThread(NULL,0,UdpRecvProc,(LPVOID)recvPar,0,NULL);}return TRUE;}BOOL TSocket::Stop(){//Kill线程???if (m_hRecv!=NULL){TerminateThread(m_hRecv,0);//关闭socketclosesocket(m_socket);}m_bIsRun = FALSE;return TRUE;}DWORD TSocket::TcpSend(){if (m_ulRemoteIP==0)return -1;SOCKET SocketSend;SocketSend=CreateSocket(TRUE);if (SocketSend==INVALID_SOCKET){return -1;}SOCKADDR_IN SocketSendIn;SocketSendIn.sin_family = AF_INET;SocketSendIn.sin_addr.S_un.S_addr = htonl(m_ulRemoteIP);SocketSendIn.sin_port = htons(m_usRemotePort);char szBuf[50];//先建立连接int nRet = connect(SocketSend,(SOCKADDR*)&SocketSendIn,sizeof(SOCKADDR));if (nRet==SOCKET_ERROR){return -1;}nRet = recv(SocketSend,szBuf,sizeof(szBuf),0);if (nRet==0)//超时{return -2;}//开始发送数据send(SocketSend,m_strData.GetBuffer(0),m_strData.GetLength(),0);closesocket(SocketSend);return 0;}DWORD TSocket::UdpSend(){if (m_ulRemoteIP==0)return -1;SOCKET SocketSend;SocketSend=CreateSocket(FALSE);if (SocketSend==INVALID_SOCKET){return -1;}SOCKADDR_IN SocketSendIn;SocketSendIn.sin_family = AF_INET;SocketSendIn.sin_addr.S_un.S_addr = htonl(m_ulRemoteIP);SocketSendIn.sin_port = htons(m_usRemotePort);int nSenlen=m_strData.GetLength()+1;sendto(SocketSend,m_strData,nSenlen,0,(SOCKADDR *)&SocketSendIn,sizeof(SOCKADDR));closesocket(SocketSend);return 0;}DWORD TSocket::SendData( CString strSend ){//保存数据m_strData = strSend;if (m_bMode){CreateThread(NULL,0,TcpSendProc,(LPVOID)this,0,NULL);}else{CreateThread(NULL,0,UdpSendProc,(LPVOID)this,0,NULL);}return 0;}SOCKET TSocket::GetSocket(){return m_socket;}DWORD WINAPI TSocket::TcpSendProc( LPVOID lpParameter ){TSocket* pThis = (TSocket*)lpParameter;return pThis->TcpSend();}DWORD WINAPI TSocket::UdpSendProc( LPVOID lpParameter ){TSocket* pThis = (TSocket*)lpParameter;return pThis->UdpSend();}****************************************TSocket.cpp*************本答案来自于互联网,仅供参考学习作用如果您对我的回答有不满意的地方,还请您继续追问; 答题不易,互相理解,互相帮助!
      如何实现基于ace库的tcp/udp通信的封装

      java多线程socket通信原理是什么?

      第一,程序是通过分时进行服务的。就是说一个程序监听一个端口,第一秒可以从别的地方来一个包,第二秒可以从另一个地方来一个包。 第二,每个socket都会有包发送来的ip地址和端口号,服务器向这个ip对应机器的端口发送数据以回应对方。
      简单点说, 每个socket都保有一些信息, 比如他所对应的客户端地址和端口等等, 来唯一确定他所负责的客户端, 所以任何到达10000端口的包都可以有去处: 如果已经有socket和他对应了, 那么交给socket处理, 如果没有, 那么放进请求队列, 等待.accept()方法去抽取他并生成一个socket来和他对应.
      当Server每接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。这样就实现了多线程socket通信。
      socket 需要 把自己的 ip 告诉ServerSocket,就是根据ip来区分的
      防止阻塞 如果不用线程,你在主线程中侦听端口, 那么你会发现,你如果不连接上的话,就会一直在等待,什么也做不了。
      java多线程socket通信原理是什么?

      C# Socket 发送数据后,断开连接对方才收到?

      C# Socket 发送数据后,不会断开连接对方才收到,一般是实时收到的,断开连接对方也能收到 学习,是指通过阅读、听讲、思考、研究、实践等途径获得知识和技能的过程。学习分为狭义与广义两种:狭义:通过阅读、听讲、研究、观察、理解、探索、实验、实践等手段获得知识或技能的过程,是一种使个体可以得到持续变化(知识和技能,方法与过程,情感与价值的改善和升华)的行为方式。例如通过学校教育获得知识的过程。广义:是人在生活过程中,通过获得经验而产生的行为或行为潜能的相对持久为方式。社会上总会出现一种很奇怪的现象,一些人嘴上埋怨着老板对他不好,工资待遇太低什么的,却忽略了自己本身就是懒懒散散,毫无价值。自古以来,人们就会说着“因果循环”,这话真不假,你种什么因,就会得到什么果。这就是不好好学习酿成的后果,那么学习有什么重要性呢?物以类聚人以群分,什么样水平的人,就会处在什么样的环境中。更会渐渐明白自己是什么样的能力。了解自己的能力,交到同水平的朋友,自己个人能力越高,自然朋友质量也越高。在大多数情况下,学习越好,自身修养也会随着其提升。同样都是有钱人,暴发户摆弄钱财只会让人觉得俗,而真正有知识的人,气质就会很不一样。高端大气的公司以及产品是万万离不了知识的,只有在知识上不输给别人,才可以在别的地方不输别人。孩子的教育要从小抓起,家长什么样孩子很大几率会变成什么样。只有将自己的水平提升,才会教育出更好的孩子。而不是一个目光短浅的人。因为有文化的父母会给孩子带去更多的在成长方面的的帮助,而如果孩子有一个有文化的父母,通常会在未来的道路上,生活得更好,更顺畅。 学习是非常的重要,学习的好坏最终决定朋友的质量、自身修养和后代教育等方面,所以平时在学习中要努力。
      C# Socket 发送数据后,断开连接对方才收到?Socket服务端成功连接之后,为什么收不到数据,断开了才有反应? void zSock::thread_Accept(void * lpvoid){//这是多线程中的接收线程,专门用来接受客户端的zSock *m_main = (zSock*)lpvoid;AfxSocketInit();CSocket sock;sock.Attach(m_main->m_sock);while (true){CSocket sock1;CString strip;int err = sock.Accept(sock1);//监听客户端,有客户端连接上来的时候,这里处理正常。CString stra;m_main->PeerNameToStr(strip, sock1);stra = strip;stra += _T("登陆成功");m_main->m_main->SetEditServerStr(stra);//成功连接上客户端,并且在服务端这边显示连接成功m_main->blSock = false;m_main->socktemp = sock1.Detach();_beginthread(thread_Receive, 0, lpvoid);while (!m_main->blSock);}}void zSock::thread_Receive(void * lpvoid){zSock *m_main = (zSock*)lpvoid;AfxSocketInit();CSocket sockthr;if (!sockthr.Attach(m_main->socktemp)){m_main->m_main->SetEditServerStr(_T("多线程中Attach出错"));return;}m_main->blSock = true;BOOL bl = true;while (bl){char ReceText[15] = { 0 };if (SOCKET_ERROR == sockthr.Receive(ReceText, sizeof(ReceText)))//问题在这里,客户端连接成功的时候,断点走到这里停止,然后等待接收数据。问题是,我客户端那边已经发送数据过来了,这边依然堵在这里一动不动。{//不管我客户端发送了多少的数据,反正就一直卡着,直到我强制关闭了然后跳到这里,报错10054:远程主机强迫关闭了一个现有的连接。//前面发的数据都不见了……m_main->GetErrorText(_T("Receive"),CString(_T("留白")));return;}//如果是客户端用调试模式,然后关闭调试,就不会报错,而是一直在这里循环,客户端都已经关掉了,服务端这边还在一直接收数据,而且:ReceText一直是空值。m_main->m_main->SetEditInStr(CString(ReceText));}sockthr.Close(); }
      正常情况下,单方面主动关闭TCP连接,也会发送FIN给对方来协商再断开,如果交互了FIN那就是双方都会断开,就谈不上收发数据了。 当然还有非正常情况,假设接收方单方面断掉了连接,发送方还不知道,会有如下两种情况:1、发送方有keepalive机制(正常都会有),如果收不到接收方回复的ack,发送方也会断掉。 2、假设没有keepalive机制,发送方给接收方发数据了,接收方确实可以收到这个数据,但是发送方发下一个数据前必须收到上一个数据的ack,如果收不到,会重传这个数据,若干次重传后会释放掉这条会话,所以接收方只能收到第一个数据,收不到后续的。
      你可以根据服务器收到的数据的长度来判断,如果服务器收到的数据长度是0,那么意味着你的客户端程序已经断开了连接。从TCP/IP协议栈的角度来说,就是客户端程序关闭了自己写的这一半连接,向服务器发出了一个FIN。这涉及到TCP的状态迁移,关于这方面的知识,建议你看一下Richard Stevens先生的《TCP/IP 详解》卷一和《Unix网络编程》卷一,上面有详细的解释。 关于你的第二个问题,建议你仔细看一下自己的服务器程序代码。服务器程序首先要建立一个监听socket,当有客户端连接上来时,服务器会在一个新socket上接受客户端连接。所以并不存在“乱”的问题。关于这个问题同样推荐你看上面的两本关于网络编程的经典著作。搜索通俗理解socket串口通信原理动画图serverless实现原理客户端与服务端的区别linux与unix有什么区别 serverless原理
      C# Socket 发送数据后,断开连接对方才收到?

      java Socket通信原理

      具体如下:首先socket 通信是基于TCP/IP 网络层上的一种传送方式,我们通常把TCP和UDP称为传输层。其中UDP是一种面向无连接的传输层协议。UDP不关心对端是否真正收到了传送过去的数据。如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。UDP常用在分组数据较少或多播、广播通信以及视频通信等多媒体领域。在这里我们不进行详细讨论,这里主要讲解的是基于TCP/IP协议下的socket通信。socket是基于应用服务与TCP/IP通信之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行分装。服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞。此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
      我发个图给你,没看懂再留言吧
      通过tcp/IP或者udp进行网络通讯。 如果还要继续深究的话,建议你看看网络协议方面的书籍
      java Socket通信原理

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/60542.html

          热门文章

          文章分类