⑴ 100分求C#异步Socket源码.
TCP协议的接收端using System.Net.Sockets ; //使用到TcpListen类using System.Threading ; //使用到线程 using System.IO ; //使用到StreamReader类int port = 8000; //定义侦听端口号private Thread thThreadRead; //创建线程,用以侦听端口号,接收信息private TcpListener tlTcpListen; //侦听端口号private bool blistener = true; //设定标示位,判断侦听状态private.NetworkStream nsStream; //创建接收的基本数据流 private StreamReader srRead;private System.Windows.Forms.StatusBar statusBar1;private System.Windows.Forms.Button button1;private System.Windows.Forms.ListBox listBox1; //从网络基础数据流中读取数据private TcpClient tcClient ;private void Listen ( ) { try { tlTcpListen = new TcpListener ( port ) ; //以8000端口号来初始化TcpListener实例tlTcpListen.Start ( ) ; //开始监听statusBar1.Text = "正在监听..." ; tcClient = tlTcpListen.AcceptTcpClient ( ) ; //通过TCP连接请求nsStream = tcClient.GetStream ( ) ; //获取用以发送、接收数据的网络基础数据流srRead=new StreamReader(nsStream);//以得到的网络基础数据流来初始化StreamReader实例statusBar1.Text = "已经连接!"; while( blistener ) //循环侦听{ string sMessage = srRead.ReadLine();//从网络基础数据流中读取一行数据 if ( sMessage == "STOP" ) //判断是否为断开TCP连接控制码{ tlTcpListen.Stop(); //关闭侦听nsStream.Close(); //释放资源srRead.Close(); statusBar1.Text = "连接已经关闭!" ; thThreadRead.Abort(); //中止线程return; } string sTime = DateTime.Now.ToShortTimeString ( ) ; //获取接收数据时的时间listBox1.Items.Add ( sTime + " " + sMessage ) ; } } catch ( System.Security.SecurityException ) { MessageBox.Show ( "侦听失败!" , "错误" ) ; } }//开始监听private void button1_Click(object sender, System.EventArgs e){thThreadRead = new Thread ( new ThreadStart ( Listen ) );thThreadRead.Start();//启动线程 button1.Enabled=false; }// 清理所有正在使用的资源。protected override void Dispose( bool disposing ){try { tlTcpListen.Stop(); //关闭侦听 nsStream.Close();srRead.Close();//释放资源 thThreadRead.Abort();//中止线程 } catch{}if( disposing ){if (components != null) {components.Dispose();}}base.Dispose( disposing );}TCP协议的发送端using System.Net.Sockets; //使用到TcpListen类using System.Threading; //使用到线程using System.IO; //使用到StreamWriter类using System.Net; //使用IPAddress类、IPHostEntry类等private StreamWriter swWriter; //用以向网络基础数据流传送数据private.NetworkStream nsStream; //创建发送数据的网络基础数据流private TcpClient tcpClient;private System.Windows.Forms.Button button1;private System.Windows.Forms.TextBox textBox1;private System.Windows.Forms.Button button2;private System.Windows.Forms.TextBox textBox2;private System.Windows.Forms.StatusBar statusBar1;private System.Windows.Forms.Label label1;private System.Windows.Forms.Label label2; //通过它实现向远程主机提出TCP连接申请private bool tcpConnect = false; //定义标识符,用以表示TCP连接是否建立//连接private void button1_Click(object sender, System.EventArgs e){IPAddress ipRemote ; try { ipRemote = IPAddress.Parse ( textBox1.Text ) ; } catch //判断给定的IP地址的合法性{ MessageBox.Show ( "输入的IP地址不合法!" , "错误提示!" ) ; return ; } IPHostEntry ipHost ; try { ipHost = Dns.Resolve ( textBox1.Text ) ; } catch //判断IP地址对应主机是否在线{ MessageBox.Show ("远程主机不在线!" , "错误提示!" ) ; return ; } string sHostName = ipHost.HostName ; try { TcpClient tcpClient = new TcpClient(sHostName,8000);//对远程主机的8000端口提出TCP连接申请nsStream = tcpClient.GetStream();//通过申请,并获取传送数据的网络基础数据流swWriter = new StreamWriter(nsStream);//使用获取的网络基础数据流来初始化StreamWriter实例button1.Enabled = false ; button2.Enabled = true ; tcpConnect = true ; statusBar1.Text = "已经连接!" ; } catch { MessageBox.Show ( "无法和远程主机8000端口建立连接!" , "错误提示!" ) ; return ; } }//发送private void button2_Click(object sender, System.EventArgs e){if (textBox2.Text !="") { swWriter.WriteLine(textBox2.Text);//刷新当前数据流中的数据swWriter.Flush(); } else {MessageBox.Show("发送信息不能为空!","错误提示!"); }}// 清理所有正在使用的资源。protected override void Dispose( bool disposing ){if ( tcpConnect ) { swWriter.WriteLine ( "STOP" ) ; //发送控制码swWriter.Flush (); //刷新当前数据流中的数据nsStream.Close (); //清除资源swWriter.Close (); } if( disposing ){if (components != null) {components.Dispose();}}base.Dispose( disposing );}异步套接字BeginAcceptPublic IAsyncResult BeginAccept{AsyncCallback callback,object state}AsyncCallback异步回调方法 object state自定义对象, 返回IasyncResultUsing System;Namespace mySocket{Public class Stateobject{Public StateObject(){构造函数逻辑}}}à>Using System;Using System.Net;Using System.Net.Sockets;Using System.Threading;Using System.Text;Namespace mysocket{Public Class StateObject{Public Socket worksocket=null;Public const int buffersize=1024;Public byte[] buffer=new byte[buffersize]; Public StringBuilder sb=new StringBuilder();Public StateObject(){}}}实现主机绑定和端口监听:Private IPAddress myIP=IPAddress.Parse(“127.0.0.1”);Private IPEndPoint MyServer;Private Socket mySocket;Private Socket Handler;Private Static ManualResetEvent myreset =new ManualResetEvent(false);Try{IPHostEntry myhost=new IPHostEntry();Myhost=dns.gethostbyName(“”);String IPString =myhost.Addresslist[0].tostring();Myip=IPAddress.Parse(IPString);}Catch{MessageBox.Show(“您输入的IP地址格式不正确,重新输入!”);}Try{MyServer=new IPEndPoint(myIP,Int32.Parse(“Port”));Mysocket=new Socket(AddressFamily.Inte.Network,SocketType.Stream,Protocol.Tcp);Mysocket.Bind(Myserver);Mysocket.Listen(50);Thread thread=new Thread(new ThreadStart(target));Thread.Start();}Catch(Exception ee){}线程targetPrivate void target(){While(true){myReset.Reset();mysocket.BeginAccept(new AsyncCallBack(AcceptCallback),mysocket);myReset.WaitOne();}}异步回调方法AcceptCallBackPrivate void AcceptCallback(IAsyncResault ar){myReset.Set();Socket Listener=(Socket)ar.AsyncState;Handler=Listener.EndAccept(ar);StateObject state=new StateObject();State.workSocket=handler;Try{Byte[] byteData=System.Text.Encoding.BigEndianUnicode.GetBytes(“通话!”+”\n\r”);Handler.BeginSend(byuteData,0,byteData.Length,0,new AsyncCallback(SendCallback),handler);}Catch(Exception ee){MessageBox.Show(ee.Message);}Thread thread=new Thread(new ThreadStart(begreceive));Thread.Start();}
⑵ socket java 源代码
很久以前做的了,启动程序两次,在单选框中选服务器点连接(一定要先点服务器-连接),在在另外一个界面中选客户端点连接;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class QQ extends JFrame implements ActionListener{
public static void main(String args[]){
QQ qq=new QQ();
}
String input;
ServerSocket ss;
Socket s1,s2;
PrintWriter pw;
BufferedReader br;
private server s;
private client cc;
private JLabel l1,l2,l3,l4,l5;
private JRadioButton jb[]=new JRadioButton[2];
private JTextField jf1,jf2,jf3;
private JButton j1,j2,j3;
private JTextArea ja;
public QQ(){
super("聊天");
Container c=getContentPane();
c.setLayout(null);
l1=new JLabel("TCP通信程序");
l1.setFont(new Font("宋体",Font.BOLD,16));
l1.setBackground(Color.black);
l1.setSize(2000,20);
l1.setLocation(10,10);
c.add(l1);
String str1[]={"服务端","客户端"};
ButtonGroup bg=new ButtonGroup();
for(int x=0;x<str1.length;x++)
{
jb[x]=new JRadioButton(str1[x]);
jb[x].setFont(new Font("宋体",Font.BOLD,15));
jb[x].setForeground(Color.black);
jb[x].setSize(80,40);
jb[x].setLocation(10+x*80,37);
bg.add(jb[x]);
c.add(jb[x]);
}
jb[0].setSelected(true);
l2=new JLabel("连接主机IP");
l2.setFont(new Font("宋体",Font.BOLD,16));
l2.setBackground(Color.black);
l2.setSize(120,20);
l2.setLocation(20, 80);
c.add(l2);
jf1=new JTextField("127.0.0.1");
jf1.setSize(220,30);
jf1.setLocation(120, 80);
c.add(jf1);
jf3=new JTextField("离线");
jf3.setSize(150,30);
jf3.setLocation(280, 40);
c.add(jf3);
l5=new JLabel("连接状态:");
l5.setFont(new Font("宋体",Font.BOLD,16));
l5.setBackground(Color.black);
l5.setSize(120,20);
l5.setLocation(200, 47);
c.add(l5);
j1=new JButton("连接");
j1.setSize(110,20);
j1.setLocation(360,85);
j1.addActionListener(this);
c.add(j1);
l3=new JLabel("接收到的信息");
l3.setFont(new Font("宋体",Font.BOLD,16));
l3.setBackground(Color.black);
l3.setSize(120,20);
l3.setLocation(20, 130);
c.add(l3);
ja=new JTextArea();
ja.setSize(250,200);
ja.setLocation(130, 130);
c.add(ja);
l4=new JLabel("发送信息");
l4.setFont(new Font("宋体",Font.BOLD,16));
l4.setBackground(Color.black);
l4.setSize(120,20);
l4.setLocation(20, 340);
c.add(l4);
jf2=new JTextField("gf");
jf2.setSize(220,30);
jf2.setLocation(120, 340);
c.add(jf2);
j2=new JButton("发送信息");
j2.setSize(110,20);
j2.setLocation(360,350);
j2.addActionListener(this);
c.add(j2);
j3=new JButton("结束连接");
j3.setSize(110,20);
j3.setLocation(360,110);
j3.addActionListener(this);
c.add(j3);
s=new server();
cc=new client();
j3.setEnabled(false);
j2.setEnabled(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,450);
setVisible(true);
setLocation(300,300);
}
public void actionPerformed(ActionEvent e) {
// TODO 自动生成方法存根
if(e.getSource()==j1)
{
try{
if(jb[0].isSelected()==true)
{
input="";
s.start();
}
else {
input="";
cc.start();
}
}
catch(Exception ee)
{
jf3.setText("发生错误");
}
}
if(e.getSource()==j2)
{
pw.write(jf2.getText()+"\n");
pw.flush();
}
if(e.getSource()==j3)
{
try
{
if(jb[0].isSelected()==true)
{ s1.close();
jf3.setText("离线");
j2.setEnabled(false);
j3.setEnabled(false);
}
else
{
s2.close();
jf3.setText("离线");
j2.setEnabled(false);
j3.setEnabled(false);
}
}
catch (Exception e1) {
// TODO 自动生成 catch 块
}
}
}
class server extends Thread{
public void run(){
try {
j1.setEnabled(false);
jf3.setText("正在连接中@");
ss=new ServerSocket(4000);
s1=ss.accept();
br=new BufferedReader(new InputStreamReader(s1.getInputStream()));
pw=new PrintWriter(s1.getOutputStream(),true);
// bs=new BufferedOutputStream(os);
while(true){
if(ss.isBound()==true){
jf3.setText("连接成功");
j2.setEnabled(true);
j3.setEnabled(true);
break;
}
}
while(true)
{
input=br.readLine();
if(input.length()>0){
ja.append(input);
ja.append("\n");
}
}
} catch (Exception e) {
// TODO 自动生成 catch 块
}
}
}
class client extends Thread{
public void run(){
try {
j1.setEnabled(false);
jf3.setText("正在连接中@");
s2=new Socket(InetAddress.getByName(jf1.getText()),4000);
// s2=new Socket();
// s2.connect(new InetSocketAddress(jf1.getText(),21),1000);
br=new BufferedReader(new InputStreamReader(s2.getInputStream()));
pw=new PrintWriter(s2.getOutputStream(),true);
// bs=new BufferedOutputStream(os);
while(true){
if(s2.isConnected()==true){
jf3.setText("连接成功");
j2.setEnabled(true);
j3.setEnabled(true);
break;
}
}
input="";
while(true){
input=br.readLine();
if(input.length()>0)
{
ja.append(input);
}
}
} catch (Exception e) {
// TODO 自动生成 catch 块
}
}
}
}
⑶ java Socket编程 为什么起多个客户端之后就会卡死在那(源码如下)
服务器端: package chat_01; import java.awt.BorderLayout; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JFrame; import javax.swing.JTextArea; public class ChatServer extends JFrame { private static final long serialVersionUID = 1L; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private JTextArea jta; private DataInputStream dis; private DataOutputStream dos; private ServerSocket serverSocket; private String dateString; public static void main(String[] args) { ChatServer server = new ChatServer(); server.showServer(); server.send(); } public void showServer() { jta = new JTextArea(); this.setLayout(new BorderLayout()); this.add(jta, BorderLayout.CENTER); this.setLocation(300, 100); this.setSize(500, 400); this.setTitle("服务器端"); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void send() { try { serverSocket = new ServerSocket(8007); while (true) { Socket socket = serverSocket.accept(); System.out.println("一个用户连接上了。。。"); dis = new DataInputStream(socket.getInputStream()); dos = new DataOutputStream(socket.getOutputStream()); new Thread(new ClientThread()).start(); } } catch (IOException e) { e.printStackTrace(); } } private class ClientThread implements Runnable { public void run() { while (true) { try { Date currentTime = new Date(); dateString = format.format(currentTime); String str = dis.readUTF(); dos.writeUTF(str); jta.append(dateString + "\n" + str + "\n"); }catch (IOException e) { e.printStackTrace(); } } } } } 客户端: package chat_01; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.Socket; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.*; public class ChatClient extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JTextArea jta; private JTextField jtf; private JButton jbt; DataOutputStream dos; DataInputStream dis; public static void main(String[] args) { ChatClient client = new ChatClient(); client.connected(); client.showClient(); } public void showClient() { jta = new JTextArea(); jta.setEditable(false); jtf = new JTextField(); jbt = new JButton("发送"); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(jtf, BorderLayout.CENTER); panel.add(jbt, BorderLayout.EAST); this.setLayout(new BorderLayout()); this.add(jta, BorderLayout.CENTER); this.add(panel, BorderLayout.SOUTH); jtf.addActionListener(this); jbt.addActionListener(this); this.setLocation(300, 100); this.setSize(500, 400); this.setTitle("客户端"); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date currentTime = new Date(); String dateString = format.format(currentTime); String text = jtf.getText(); jta.append(dateString + "\n"); jta.append(text + "\n"); jtf.setText(""); jtf.grabFocus();// 文本框获取光标(焦点) try { dos.writeUTF(text); dos.flush(); jta.append(dis.readUTF()); System.out.println(text + "client"); } catch (IOException e1) { e1.printStackTrace(); } } public void connected() { try { Socket socket = new Socket("127.0.0.1", 8007); dos = new DataOutputStream(socket.getOutputStream()); dis = new DataInputStream(socket.getInputStream()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
⑷ linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 ,。。谢谢
简单的:
//client
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#define ERR() \
do { perror(""); printf("%d -- func: %s\n", __LINE__, __FUNCTION__); return -1; } while(0)
int main (int argc, char *argv[])
{
int sockfd, fd, nbytes;
struct sockaddr_in addr;
struct stat f_stat;
if (argc < 3) {
ERR();
}
fd = open (argv[2], O_RDONLY);
if (fd == -1) {
ERR();
}
sockfd = socket (AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
ERR();
}
addr.sin_family = AF_INET;
addr.sin_port = htons (5678);
inet_aton (argv[1], &addr.sin_addr);
if (-1 == lstat (argv[2], &f_stat) ) {
ERR();
}
char *buff = (char *) mmap (NULL, f_stat.st_size, PROT_READ, MAP_SHARED, fd, 0);
nbytes = sendto (sockfd, (void *) buff, f_stat.st_size, 0, (struct sockaddr *) &addr, (socklen_t) sizeof (addr) );
if (nbytes == -1) {
ERR();
}
munmap (buff, f_stat.st_size);
close (fd);
return 0;
}
===================================
//server
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#define SIZE 512
#define ERR() \
do { perror(""); printf("%d -- func: %s\n", __LINE__, __FUNCTION__); return -1; } while(0)
int main (void)
{
int sockfd, fd, nbytes, ret;
socklen_t addr_len;
char buff[SIZE];
struct sockaddr_in addr;
sockfd = socket (AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
ERR();
}
memset ( (void *) &addr, 0, sizeof (addr) );
addr.sin_family = AF_INET;
addr.sin_port = htons (5678);
addr.sin_addr.s_addr = htonl (INADDR_ANY);
addr_len = sizeof (addr);
ret = bind (sockfd, (const struct sockaddr *) &addr, addr_len);
if (ret == -1) {
ERR();
}
printf ("#### Waiting For Data ... ####\n");
fd = creat ("recv", S_IWUSR | S_IRUSR);
nbytes = recvfrom (sockfd, (void *) buff, SIZE, 0, (struct sockaddr *) &addr, (socklen_t *) &addr_len);
if (nbytes == -1) {
ERR();
}
write (fd, (void *) buff, nbytes);
close (fd);
return 0;
}
⑸ linux socket网络编程学完看哪些源码
1、仔细研究一下TCP/IP 2、看一下SOCKET模型结构 3、多研究一下UDP与TCP区别 4、更多交流参考我空间文章。
⑹ 使用c++6.0,基于Socket开发网络音频点播程序。求源码!
“对图中的那些函数,我这里稍加解释一下。” int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 功能是初始化Windows Socket Dll,在Windows下必须使用它。参数:“wVersionRequested”表示版本,可以是1.1、2.2等;“lpWSAData”指向WSADATA数据结构的指针。int socket(int family, int type, int protocol); 功能是建立Socket,返回以后会用到的Socket值。如果错误,返回-1。参数:“int family”参数指定所要使用的通信协议,取以下几个值:AF_UNIX(Unix内部协议)、AF_INET(Internet协议)、AF_NS Xerox(NS协议)、AF_IMPLINK(IMP连接层),在Windows下只能把“AF”设为“AF_INET”;“int type”参数指定套接字的类型,取以下几个值:SOCK_STREAM(流套接字)、SOCK_DGRAM (数据报套接字)、SOCK_RAW(未加工套接字)、SOCK_SEQPACKET(顺序包套接字);“int protocol”参数通常设置为0。int bind(int sockfd, struct sockaddr *my_addr, int addrlen); 功能是把套接字和机器上一定的端口关联起来。参数:“sockfd”是调用socket()返回的套接字值;“my_addr”是指向数据结构struct sockaddr的指针,它保存你的地址,即端口和IP地址信息;“addrlen”设置为sizeof(struct sockaddr)。 int listen(int sockfd, int backlog); 功能是服务端监听一个端口,直到accept()。在发生错误时返回-1。参数:“sockfd”是调用socket()返回的套接字值;“backlog”是允许的连接数目。大多数系统的允许数目是20,也可以设置为5到10。 int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 功能是客户端连接服务端监听的端口。参数:“sockfd”是调用socket()返回的套接字值;“serv_addr”保存着目的地端口和IP 地址的数据结构struct sockaddr;“addrlen”设置为sizeof(struct sockaddr)。 int accept(int sockfd, void *addr, int *addrlen); 功能是服务端接受客户端的连接请求,并返回一个新的套接字,以后服务端的数据传输就使用这个新的套接字。如果有错误,返回-1。参数:“sockfd”是和listen()中一样的套接字值;“addr”是个指向局部的数据结构sockaddr_in的指针;“addrlen”设置为sizeof(struct sockaddr_in)。int send(int sockfd, const void *msg, int len, int flags);int recv(int sockfd, void *buf, int len, unsigned int flags);功能是用于流式套接字或数据报套接字的通讯,我们数据的真正传输就由它们完成。参数:“sockfd”是发/收数据的套接字值;“msg”指向你想发送的数据的指针;“buf”是指向接收数据存放的地址;“len”是数据的长度;“flags”设置为 0。int sendto(int sockfd, const void *msg, int len, unsigned int flags,const struct sockaddr *to, int tolen);int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);功能和send、recv类似,不过是用于无连接数据报套接字的传输。 int closesocket(int sockfd) 功能是关闭套接字。参数“sockfd”为要关闭的套接字值。程序:“这里的目的是让大家对Socket编程有个整体了解。不用怕,程序我会详细解释的,首先是服务端的程序。其流程是: socket()→bind()→listen→accept()→recv()/send()→closesocket() 具体代码如下:”★#include #include #pragma comment(lib,"Ws2_32")#define MYPORT 830 /*定义用户连接端口*/ #define BACKLOG 10 /*多少等待连接控制*/ int main() { int sockfd, new_fd; /*定义套接字*/ struct sockaddr_in my_addr; /*本地地址信息 */ struct sockaddr_in their_addr; /*连接者地址信息*/ int sin_size; WSADATA ws; WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll //建立socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { //如果建立socket失败,退出程序 printf("socket error\n"); exit(1); } //bind本机的MYPORT端口 my_addr.sin_family = AF_INET; /* 协议类型是INET */ my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口*/ my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP*/ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1) { //bind失败,退出程序 printf("bind error\n"); closesocket(sockfd); exit(1); } //listen,监听端口 if (listen(sockfd, BACKLOG) == -1) { //listen失败,退出程序 printf("listen error\n"); closesocket(sockfd); exit(1); } printf("listen"); //等待客户端连接 sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) { printf("accept error\n"); closesocket(sockfd); exit(1); } printf("\naccept!\n"); //有连接,发送ww0830字符串过去 if (send(new_fd, "ww0830\n", 14, 0) == -1) { printf("send error"); closesocket(sockfd); closesocket(new_fd); exit(1); } printf("send ok!\n"); //成功,关闭套接字 closesocket(sockfd); closesocket(new_fd); return 0;}对服务端程序的流程概括:先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws); 然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0) 再bind本机的MYPORT端口:my_addr.sin_family = AF_INET; /* 协议类型是INET */ my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口 */ my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP */ bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) 接下来监听端口: listen(sockfd, BACKLOG) 如果有客户端的连接请求,接收它: new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size) 最后发送ww0830字符串过去: send(new_fd, "ww0830\n", 14, 0) 收尾工作,关闭socket: closesocket(sockfd); closesocket(new_fd); ”编译、执行,就会一直监听830端口客户端程序了。其流程是: socket()→connect()→send()/recv()→closesocket() 比服务端更简单吧!其实现代码如下:”★#include #include #include #pragma comment(lib,"Ws2_32") #define PORT 830 /* 客户机连接远程主机的端口 */ #define MAXDATASIZE 100 /* 每次可以接收的最大字节 */ int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct sockaddr_in their_addr; /* 对方的地址端口信息 */ if (argc != 2) { //需要有服务端ip参数 fprintf(stderr,"usage: client hostname\n"); exit(1); } WSADATA ws;WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ //如果建立socket失败,退出程序 printf("socket error\n"); exit(1); } //连接对方their_addr.sin_family = AF_INET; /* 协议类型是INET */ their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */ their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */ if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1){ //如果连接失败,退出程序 printf("connet error\n"); closesocket(sockfd); exit(1); } //接收数据,并打印出来if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { //接收数据失败,退出程序 printf("recv error\n"); closesocket(sockfd); exit(1); } buf[numbytes] = '\0'; printf("Received: %s",buf); closesocket(sockfd); return 0; } 对客户端程序的流程概括:首先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws); 然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0) 接着连接服务器方:their_addr.sin_family = AF_INET; /* 协议类型是INET */ their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */ their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */ connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) 连接成功就接收数据: recv(sockfd, buf, MAXDATASIZE, 0) 最后把收到的数据打印出来并关闭套接字: printf("Received: %s",buf); closesocket(sockfd); 编译结束后,运行服务端,然后。客户端 服务端IP 回车你会看到服务端发来得数据。那么基本的点对点通信就没问题了。只要两台机器同时包含服务端和客户端,就可以互相通信了。当然,你也可以将服务端和客户端分开做,专门一个服务器负责用户登录和转发消息。流程如下:A客户端发登录消息-----》服务器服务器验证发送用户消息----》客户端A客户端想发消息给B客户端----》先发给服务端服务器得到消息查询B客户端IP并转发消息。(或者B客户端循环发消息询问服务器有无消息)通信结束。
⑺ C# socket 聊天的 C/s程序 源码
//"开始"按钮事件
privatevoidbutton1_Click(objectsender,System.EventArgse){
//取得预保存的文件名
stringfileName=textBox3.Text.Trim();
//远程主机
stringhostName=textBox1.Text.Trim();
//端口
intport=Int32.Parse(textBox2.Text.Trim());
//得到主机信息
IPHostEntryipInfo=Dns.GetHostByName(hostName);
//取得IPAddress[]
IPAddress[]ipAddr=ipInfo.AddressList;
//得到ip
IPAddressip=ipAddr[0];
//组合出远程终结点
IPEndPointhostEP=newIPEndPoint(ip,port);
//创建Socket实例
Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
//尝试连接
socket.Connect(hostEP);
}
catch(Exceptionse)
{
MessageBox.Show("连接错误"+se.Message,"提示信息
,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
}
//发送给远程主机的请求内容串
stringsendStr="GET/HTTP/1.1 Host:"+hostName+
" Connection:Close ";
//创建bytes字节数组以转换发送串
byte[]bytesSendStr=newbyte[1024];
//将发送内容字符串转换成字节byte数组
bytesSendStr=Encoding.ASCII.GetBytes(sendStr);
try
{
//向主机发送请求
socket.Send(bytesSendStr,bytesSendStr.Length,0);
}
catch(Exceptionce)
{
MessageBox.Show("发送错误:"+ce.Message,"提示信息
,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
}
//声明接收返回内容的字符串
stringrecvStr="";
//声明字节数组,一次接收数据的长度为1024字节
byte[]recvBytes=newbyte[1024];
//返回实际接收内容的字节数
intbytes=0;
//循环读取,直到接收完所有数据
while(true)
{
bytes=socket.Receive(recvBytes,recvBytes.Length,0);
//读取完成后退出循环
if(bytes〈=0)
break;
//将读取的字节数转换为字符串
recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
}
//将所读取的字符串转换为字节数组
byte[]content=Encoding.ASCII.GetBytes(recvStr);
try
{
//创建文件流对象实例
FileStreamfs=newFileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);
//写入文件
fs.Write(content,0,content.Length);
}
catch(Exceptionfe)
{
MessageBox.Show("文件创建/写入错误:"+fe.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
}
//禁用Socket
socket.Shutdown(SocketShutdown.Both);
//关闭Socket
socket.Close();
}
}
⑻ linux下socket 网络编程(客户端向服务器端发送文件) 求源代码 大哥大姐帮帮忙 。。谢谢
server:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
#define MAXDATASIZE 1024
#define SERVPORT 19999
#define BACKLOG 10
int SendFileToServ(const char *path, const char *FileName, const char *ip)
{
#define PORT 20002
int sockfd;
int recvbytes;
char buf[MAXDATASIZE];
char send_str[MAXDATASIZE];
char filepath[128] = {0};
struct sockaddr_in serv_addr;
FILE *fp;
sprintf(filepath, "%s%s", path, FileName);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
return 1;
}
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
inet_aton(ip, &serv_addr.sin_addr);
int IErrCount = 0;
again:
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
if (5 == IErrCount)
return 1;
IErrCount++;
perror("connect");
sleep(2);
goto again;
}
//if ((fp = fopen(FileName, "rb")) == NULL)
if ((fp = fopen(filepath, "rb")) == NULL)
{
perror("fopen ");
return 1;
}
recvbytes = write(sockfd, FileName, strlen(FileName));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (!memcmp(buf, "sendmsg", 7))
{
while(fgets(send_str, MAXDATASIZE, fp))
{
recvbytes = write(sockfd, send_str, strlen(send_str));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (recvbytes <= 0)
{
fclose(fp);
close(sockfd);
return 1;
}
if (memcmp(buf, "goon", 4))
{
fclose(fp);
close(sockfd);
return 1;
}
}
recvbytes = write(sockfd, "end", 3);
}
else
{
fclose(fp);
close(sockfd);
return 1;
}
memset(buf, 0, MAXDATASIZE);
if (read(sockfd, buf, MAXDATASIZE) <= 0)
{
close(sockfd);
return 2;
}
char *Eptr = "nginx reload error";
//printf("bf[%s]\n", buf);
int ret;
ret = strncmp(buf, Eptr, strlen(Eptr));
//printf("%d\n", ret);
if (!ret)
{
close(sockfd);
return 2;
}
close(sockfd);
return 0;
}
int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// 请在循环体中判断,如果re_conf == 1,请再次加载配置文件。
}
static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/apuserv.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}
int MyHandleBuff(const char *buf, char *str, char *FileName, char *pth)
{
sscanf(buf, "%s %s %s", pth, FileName, str);
printf("path=%s\nfilename=%s\nip=%s\n", pth, FileName, str);
return 0;
}
int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"apuserver start....");
while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "apuserv is already running\n");
syslog(LOG_INFO,"apuserv is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
int nret;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
char str[16] = {0};
char FileName[128] = {0};
char path[128] = {0};
MyHandleBuff(buff, str, FileName, path);
if (recvbytes > 0)
{
nret = SendFileToServ(path, FileName, str);
printf("nret[%d]\n", nret);
if (1 == nret)
write(client_fd, "send file error", 15);
else if(2 == nret)
write(client_fd, "reload nginx error", 18);
else
write(client_fd, "succ", 4);
}
close(client_fd);
}
}
_________________________________________________
client:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
#define MAXDATASIZE 1024
#define SERVPORT 20002
#define BACKLOG 10
int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// ????·???????1nf == 1£???′μ?????
static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/dstserver.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}
int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"dstserver start....");
while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "dstserver is already running\n");
syslog(LOG_INFO,"dstserver is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
char filepath[MAXDATASIZE]= {0};
FILE *fp;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
sprintf(filepath, "/etc/nginx/url_rule/%s", buff);
if ((fp = fopen(filepath, "wb")) == NULL)
{
perror("fopen");
close(client_fd);
continue;
}
write(client_fd, "sendmsg", 7);
while(read(client_fd, buff, MAXDATASIZE))
{
if (!memcmp(buff, "end", 3))
{
fclose(fp);
break;
}
else
{
fprintf(fp, "%s", buff);
write(client_fd, "goon", 4);
}
}
//system("nginx -s reload");
char *Sptr = "nginx reload succ";
char *Eptr = "nginx reload error";
int ret;
ret = system("nginx -s reload");
printf("ret[%d]\n", ret);
if (ret != 0)
{
write(client_fd, Eptr, strlen(Eptr));
}
else
{
write(client_fd, Sptr, strlen(Sptr));
}
close(client_fd);
}
}
以前写的:内容忘记了。不是很复杂你可以自己看!
⑼ Linux中C语言的一个函数的源代码:socket 编程中的 recv() 函数。
在内核中它是sys_recv()
⑽ 求一个socket聊天程序源码 C语言的
通过socket编程自己写一个呗,可以学习一下socket编程方面的知识