c网络通信编程
在c语言中 !代表 逻辑运算符非,5 是非0 , 所以 !5 表示 0。 C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
❷ C/C++如何网络编程
编程方面推荐你看下SOCKET C API,这是所有网络编程的基础。
现在大部分通信都是基于TCP/IP协议, 建议你看下 这方面的书籍,这里很难讲清楚。
❸ c语言网络编程
可以,不过C语言擅长的是逻辑处理和底层交互,页面展现用C就太麻烦了
如果是网络方面的编程,建议你看看套接口Socket方面的书,最好在Linux下面,在Win下面就用wsock32的知识
❹ c语言的网络编程特点有哪些(在线等待,答得好马上给分!)
1、你说得用C语言开发网络程序,一定指的是在WIN/UNIX/LINUX/SOLARIS/FreeBSD等多进程/多线程操作系统下的编程,网络编程是基于B/S或者C/S架构的,无论那种,S都需要有多线程或者子进程的处理与客户端通信的能力,DOS下的C是不具备这个能力。另外,网络程序是对操作系统多线程/多进程能力要求很高的应用,所以UNIX下的C编程能很好的满足要求。
2、网络编程只要遵从一种协议,语言是没有限定的,比较各种语言编写的网路应用的特点,归根结底还是回到这种语言已经它存在的操作系统的特点。相比与其他语言开发的网络程序,用UNIX/SOKCET/C这种模式开发的网络应用能最大限度的利用系统资源,同时兼备UNIX的稳定性和C的高效率,是大型网络应用经常采用的方式,例如着名的freeBSD,大量的论坛都是这样的方式。很多网络应用,离开UNIX和C,在重连接负荷的情况下是无法工作的。
3、但是由于高效与通用是一对矛盾,UNIX/C开发的网络应用,比较靠近系统底层,代码的可移植性、可重用性相对于使用winsock编程的WINDOWS/C++方案的网络应用要差一些,windows的MFC已经对网络协议做了很多层的封装,使用C++来继承可以节省大量开发时间。
4、结论,如果你想开发自己全新的网络应用/协议,并且要承担很重的用户访问负荷,那么你可以用C,而且操作系统要用UNIX/LINUX,如果你仅仅希望用已经成熟的internet协议写一些界面漂亮的网络应用,推荐你用WINDOWS/C++方式。
❺ 在windows下用C语言如何实现socket网络编程,需要用到哪些头文件或者库
需要用到的头文件包含:
#include <winsock2.h>
#include <windows.h>
与Linux环境下socket编程相比,windows环境多了一个步骤:启动或者初始化winsock库
Winsock,一种标准API,一种网络编程接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本:
Winsock 1:
Windows CE平台支持。
头文件:WinSock.h
库:wsock32.lib
Winsock 2:
部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数;
头文件:WinSock2.h
库:ws2_32.lib
mswsock.h用于编程扩展,使用时必须链接mswsock.dll
(5)c网络通信编程扩展阅读
winsock库的加载与卸载:
加载:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
加载成功,返回值为0。
WORD wVersionRequested:加载的winsock版本,使用宏MAKEWORD(x, y),x表示高字节,y表示低字节。然而使用时MAKEWORD(2, 2)。高字节与低字节相同~~
LPWSADATA lpWSAData:WSADATA结构的指针,传入参数后,系统帮助我们填充版本信息。有兴趣的可以看看结构体内容,不过基本用不着。
卸载:int WSACleanup(void);比起加载,卸载的函数真是轻松愉快。
❻ C#如何实现网口通讯
网口通迅啊,你的意思是通过网络和别的计算机通信吗?如果是的话那就是socket通信了,我给你个例子看看
服务器端:
try
{
int port = 2000;
string host = "176.64.158.112";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe);//绑定2000端口
s.Listen(0);//开始监听
ShowMessage("Waitforconnect");
while (true)
{
Socket temp = s.Accept();//为新建连接创建新的Socket。
ShowMessage("Getaconnect from " + temp); //this.Invoke(new ShowMes(ShowMessage), "Getaconnect");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr = Encoding.ASCII.GetString(recvBytes, 0, bytes);
ShowMessage(String.Format("ServerGetMessage:{0}", recvStr));//this.Invoke(new ShowMes(ShowMessage), String.Format("ServerGetMessage:{0}", recvStr)); //把客户端传来的信息显示出来
string sendStr = "Ok!ClientSendMessageSucessful!";
byte[] bs = Encoding.ASCII.GetBytes (sendStr);
temp.Send(bs, bs.Length, 0);//返回客户端成功信息
}
//temp.Close();
//s.Close();
}
catch (ArgumentNullException e)
{
ShowMessage(String.Format("ArgumentNullException:{0}", e));
}
catch (SocketException e)
{
ShowMessage(String.Format("SocketException:{0}", e));
}
Console.WriteLine("PressEntertoExit");
客户端:
try
{
Socket c;
int port = 2000;
string host = "176.64.158.112";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
ShowMessage("Conneting...");
c.Connect(ipe);//连接到服务器
string sendStr = "hello!This is a socket test";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
ShowMessage("SendMessage");
c.Send(bs, bs.Length, 0);//发送测试信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
if (bytes <= 0)
break;
recvStr = Encoding.ASCII.GetString(recvBytes, 0, bytes);
ShowMessage(String.Format("ClientGetMessage:{0}", recvStr));//显示服务器返回信息
sendStr = "hello!This is a socket test";
bs = Encoding.ASCII.GetBytes(sendStr);
ShowMessage("SendMessage");
c.Send(bs, bs.Length, 0);//发送测试信息
Thread.Sleep(100);
c.Close();
}
catch (ArgumentNullException e)
{
ShowMessage(String.Format("ArgumentNullException:{0}", e));
}
catch (SocketException e)
{
ShowMessage(String.Format("SocketException:{0}", e));
}
ShowMessage(String.Format("PressEntertoExit"));
❼ C语言网络编程
路由器本身不具备数据保存能力。
通常,路由器的功能是端口转发。在路由器建立端口映射(公网某端口和内网某台电脑的某端口关联)后,外网电脑才能和内网某电脑进行通信,通信过程中路由器一直负责数据的中转。但内网电脑一旦关闭连接,路由器是无法单独收取并保存信息的,它会直接把断连事件通知给连接的另一端(外网某电脑)。
例如你的情况,如果局域网里是作为服务器S(监听方),外网某电脑作为客户端C(连接方)。
S程序本身监听端口2014,而C要连接的是路由器在公网的12345端口。
设路由器在公网IP是123.124.125.126,S的内网IP是192.168.1.1。
这时需要对路由器进行手动配置,让路由器能将公网的12345端口和内网192.168.1.1这台电脑的2014映射关联。
这时,内网192.168.1.1上的S对2014进行监听(就用bind然后listen),路由器会反映到公网上,于是在公网看来,就是”电脑“123.124.125.126在对12345进行监听。
而如果外网连接123.124.125.126:12345(注意冒号),路由器会将这个连接请求转化成对192.168.1.1:2014(注意冒号)的连接请求,于是S就会收到连接,能用accept接受它。
后面都和局域网编程一样了。
有问题请继续追问。
❽ 请教关于C++网络通信编程
我这段时间也在学网络编程,给推荐本书<<unix网络编程>>,个人感觉这才是正宗,虽然很多,但是没有哪一门学问能以两天就能学成的,慢慢来。windows上的东西,次,因为你要搞网络编程就免不了要做服务器,通常服务器上有多少公司敢用windows.
至于实习,我真的还没有听说过哪个单位招实习生要看人家的作品,通常你只需要讲出大概能容就可以了。
❾ 200分,C++网络通信,高手,工作过的进!!
朋友!!!我感觉应该如下
CSocket是MFC在CAsyncSocket基础上派生的一个同步阻塞Socket的封装类。它是如何又把CAsyncSocket变成同步的,而且还能响应同样的Socket事件呢? 其实很简单,CSocket在Connect()返回WSAEWOULDBLOCK错误时,不是在OnConnect(),OnReceive()这些事件终端函数里去等待。你先必须明白Socket事件是如何到达这些事件函数里的。这些事件处理函数是CSocketWnd窗口对象回调的,而窗口对象收到来自Socket的事件,又是靠线程消息队列分发过来的。总之,Socket事件首先是作为一个消息发给CSocketWnd窗口对象,这个消息肯定需要经过线程消息队列的分发,最终CSocketWnd窗口对象收到这些消息就调用相应的回调函数(OnConnect()等)。 所以,CSocket在调用Connect()之后,如果返回一个WSAEWOULDBLOCK错误时,它马上调用一个用于提取消息的函数PumpMessage(...),就是从当前线程的消息队列里取关心的消息. PumnMessage会遇到下面几种情况: 1 提取出了(从消息队列中移出来Remove),用户正在使用的一个Socket发送的WM_SOCKET_NOTIFY消息和对应的 FD_XXX事件,返回True. 2 提取出了(从消息队列中移出来Remove),用户正在使用的一个Socket发送的WM_SOCKET_NOTIFY消息和对应的 FD_Close事件,返回True. 3 提取出了(从消息队列中移出来Remove),PumpMessage(..)设定的定时器的WM_TIMER消息,TimeOut事件为 CSocket的一个成员变量,m_nTimeOut=2000ms,返回True 4 用户调用了CancelBlockingCall() 设置错误代码为WSAEINTR(被中断了),返回False 5 用户一直没有取到用户正在使用的一个Socket发送的WM_SOCKET_NOTIFY消息和对应的FD_XXX事件,但是取到 了同一个线程中的其他Socket的WM_SOCKET_NOTIFY消息及其对应的消息,则将这些消息,加入到一个辅助性 的队列中去,以后处理. 6 没有取到任何WM_SOCKET_NOTIFY消息,则开始查看(不是取出来,而是查看)本线程的消息队列中是否有其他 消息,如果有的话,调用虚函数OnMessagePending(),来处理这些消息(OnMessagePending()用户可以自定义 在阻塞时,用户想要处理的消息),如果没有,则调用WaitMessage()开始等待消息的到来. 代码说明如下: A 先看Connect,因为Connect的阻塞的实现和Accept,Receive,ReceiveFrom,Send,SendTo都有点不同. 也许你们会奇怪为何是ConnectHelper(...),而不是Connect(...).其实ConnectHelper(...)才是Connect(..) 真正调用的东西,如下: BOOL CAsyncSocket::Connect(const SOCKADDR* lpSockAddr, int nSockAddrLen) { return ConnectHelper(lpSockAddr, nSockAddrLen); } //ConnectHelper( ... )为一虚函数 //继承自CAsyncSocket,Csocket有重新定义过. //这也是为什么CSocket是Public继承的原因 BOOL CSocket::ConnectHelper( ... ) { //一旦调用 就先检查当前是否有一个阻塞操作正在进行 //如果是,立马返回,并设置错误代码. ...... ...... m_nConnectError = -1; //注意它只调用了一次CAsyncSocket::ConnectHelper( ... ) if( !CAsyncSocket::ConnectHelper( ... ) ) { //由于Connect(...)要求自己和Server进行三步握手 //即需要发送一个Packet,而且等待回复(这个也就是 //涉及连接和发送数据操作的Socket API会阻塞的原因) //所以CAsyncSocket::ConnectHelper(...)会立即返回, //并且设置错误为WSAEWOULDBLOCK(调用该函数会导致阻塞) if( WSAGetLastError() == WSAEWOULDBLOCK ) { //进入消息循环,以从线程消息队列里查看FD_CONNECT消息, //收到FD_CONNECT消息(在PumpMessage中会修改m_nConnectError),返回 //或者WM_TIMER/FD_CLOSE(return true,但不会修改m_nConnectError), //继续调用PumpMessage来取消息 //或者错误,那么就返回socket_error while( PumpMessages( FD_CONNECT ) ) { if (m_nConnectError != -1) { WSASetLastError(m_nConnectError); return (m_nConnectError == 0); } } //end while } return false; } return true; } //在PumpMessages中会设置一个定时器,时间为m_nTimeOut=2000ms //当在这个时间之内,依然没有得到消息的话,就返回 BOOL CSocket::PumpMessages( UINT uStopFlag ) { //一旦进入这个函数,就设置Socket当前状态为阻塞 BOOL bBlocking = TRUE; m_pbBlocking = &bBlocking; .................... ..................... .................... CWinThread* pThread = AfxGetThread(); //bBlocking是一个标志, // 用来判断用户是否取消对Connect()的调用 //即是否调用CancelBlockingCall() while( bBlocking ) { //#define WM_SOCKET_NOTIFY 0x0373 //#define WM_SOCKET_DEAD 0x0374 MSG msg; //在此处只是取WM_SOCKET_NOTIFY 和 WM_SOCKET_DEAD消息 if (::PeekMessage(&msg, pState->m_hSocketWindow,WM_SOCKET_NOTIFY, WM_SOCKET_DEAD, PM_REMOVE)) { if (msg.message == WM_SOCKET_NOTIFY && (SOCKET)msg.wParam == m_hSocket) { //这个是PumpMessage的第2种情况 if (WSAGETSELECTEVENT(msg.lParam) == FD_CLOSE) { break;} //这个是PumpMessage的第1种情况 if(WSAGETSELECTEVENT(msg.lParam) == uStopFlag ) { ......; break;} } //这个是PumpMessage的第5种情况 if (msg.wParam != 0 || msg.lParam != 0) CSocket::AuxQueueAdd(msg.message, msg.wParam, msg.lParam); } //这个是PumpMessage的第3种情况 else if (::PeekMessage(&msg, pState->m_hSocketWindow,WM_TIMER, WM_TIMER, PM_REMOVE)) { break;} //这个是PumpMessage的第6种情况 if (bPeek && ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { if (OnMessagePending()) { } else { WaitMessage(); ..... } } }//end while ////这个是PumpMessage的第4种情况 if (!bBlocking) { WSASetLastError(WSAEINTR); return FALSE; } m_pbBlocking = NULL; //将WM_SOCKET_NOTIFY消息发送到Creat CSocketWnd线程的消息队列中 //以便处理其他的Socket消息 ::PostMessage(pState->m_hSocketWindow, WM_SOCKET_NOTIFY, 0, 0); return TRUE; } B 再看Receive(..) //其实CSocket的这种实现方式决定了,应用程序不能够在一个线程中Create一个socket, //然后创建一个新的线程来专门Receive,因为这个新的线程将永远不能取到FD_Read的事件, //因为并不是在这个线程中创建的CSocketWnd对象,它无法接受到发送到CSocketWnd的消息 //(在Windows中接受消息的主体是窗口) //Receive和Connect的实现方式的最大区别为 //Connect 是不断的调用PumpMessage(..) //而Receive则不断的调用自身 int CSocket::Receive(void* lpBuf, int nBufLen, int nFlags) { if (m_pbBlocking != NULL) { WSASetLastError(WSAEINPROGRESS); return FALSE; } int nResult; while ((nResult = CAsyncSocket::Receive(lpBuf, nBufLen, nFlags)) == SOCKET_ERROR) { if (GetLastError() == WSAEWOULDBLOCK) { //一旦提取到FD_READ///FD_CLOSE///WM_TIMER时 // 就再次调用CAsyncSocket::Receive(...) if (!PumpMessages(FD_READ)) return SOCKET_ERROR; } else return SOCKET_ERROR; } return nResult; } 最后,总结一下自己对CSocket的看法, 1 虽然它解决了结束阻塞线程的方法,调用CancelBlockingCall,但是多线程模式根本就不适合于CSocket 2 CSocket和CAsyncSocket利用Windows的消息模式将前台的界面处理和后台的网络通信都整合到消息传递模型 下,但是很明显,一旦后台的网络过于繁忙,则前台的处理可能就无法顾及,所以CSocket也就只能小打小闹
建议你多看MSDN,上面说的清楚,和孙鑫的VC++视频!!